Home All Groups Group Topic Archive Search About
Author
20 Dec 2005 7:49 AM
Albert Krüger
Hello,

i use a class (see below), which I has found at
http://www.msjogren.net/dotnet/eng/samples/dotnet_dynpinvoke.asp, to
unregister ActiveX components. The class works fine. But I have following
problem. After I had unregister the ActiveX components I want to delete
them. But some of  them I can not delete. I get the error message that they
are in use. Now I found that when I not unregister the ActiveX components I
have no problems and I can delete all. So I think there is a problem with
the class by unregistering the ActiveX components. Has anybody a solution
for my problem?

Thanks

Albert Krüger


The code of the class:

Imports System
Imports System.Reflection
Imports System.Reflection.Emit
Imports System.Runtime.InteropServices

Public Class CDllRegServer

    Public Sub New(ByVal dllFile As String)
        m_sDllFile = dllFile
        CreateDllRegType()
    End Sub

    Public Sub Register()
        InternalRegServer(False)
    End Sub

    Public Sub UnRegister()
        InternalRegServer(True)
    End Sub

    Private Sub InternalRegServer(ByVal fUnreg As Boolean)

        Dim sMemberName As String


        If fUnreg Then
            sMemberName = "DllUnregisterServer"
        Else
            sMemberName = "DllRegisterServer"
        End If

        Dim hr As Integer

        hr = CInt(m_tDllReg.InvokeMember(sMemberName,
BindingFlags.InvokeMethod, Nothing, _
                                         Activator.CreateInstance(m_tDllReg),
Nothing))

        ' With Option Strict disabled, the above can be written using late
binding
        ' like this:
        'If fUnreg Then
        '  hr =
CInt(Activator.CreateInstance(m_tDllReg).DllUnregisterServer())
        'Else
        '  hr =
CInt(Activator.CreateInstance(m_tDllReg).DllRegisterServer())
        'End If

        If hr <> 0 Then Marshal.ThrowExceptionForHR(hr)

    End Sub

    Private Sub CreateDllRegType()

        If s_mb Is Nothing Then
            ' Create dynamic assembly
            Dim an As New AssemblyName
            an.Name = "DllRegServerAssembly" & Guid.NewGuid().ToString("N")
            Dim ab As AssemblyBuilder
            ab = AppDomain.CurrentDomain.DefineDynamicAssembly(an,
AssemblyBuilderAccess.Run)

            ' Add module to assembly
            s_mb = ab.DefineDynamicModule("DllRegServerModule")
        End If

        ' Add class to module
        Dim tb As TypeBuilder = s_mb.DefineType("DllRegServerClass" &
Guid.NewGuid().ToString("N"))

        Dim meb As MethodBuilder

        ' Add PInvoke methods to class
        meb = tb.DefinePInvokeMethod("DllRegisterServer", m_sDllFile, _
          MethodAttributes.Public Or MethodAttributes.Static Or
MethodAttributes.PinvokeImpl, _
          CallingConventions.Standard, GetType(Integer), Nothing, _
          CallingConvention.StdCall, CharSet.Auto)

        ' Apply preservesig metadata attribute so we can handle return
HRESULT ourselves
        meb.SetImplementationFlags(MethodImplAttributes.PreserveSig Or
meb.GetMethodImplementationFlags())

        meb = tb.DefinePInvokeMethod("DllUnregisterServer", m_sDllFile, _
          MethodAttributes.Public Or MethodAttributes.Static Or
MethodAttributes.PinvokeImpl, _
          CallingConventions.Standard, GetType(Integer), Nothing, _
          CallingConvention.StdCall, CharSet.Auto)

        ' Apply preservesig metadata attribute so we can handle return
HRESULT ourselves
        meb.SetImplementationFlags(MethodImplAttributes.PreserveSig Or
meb.GetMethodImplementationFlags())

        ' Create the type
        m_tDllReg = tb.CreateType()

    End Sub

    Private m_sDllFile As String
    Private Shared s_mb As ModuleBuilder
    Private m_tDllReg As Type

End Class

Author
20 Dec 2005 7:34 PM
Mattias Sjögren
>Has anybody a solution for my problem?

You can try calling the FreeLibrary API to release the library when
you're done. Or do the unregistering in a separate process so you
don't have to load the library into your own.


Mattias

--
Mattias Sjögren [C# MVP]  mattias @ mvps.org
http://www.msjogren.net/dotnet/ | http://www.dotnetinterop.com
Please reply only to the newsgroup.
Author
21 Dec 2005 12:02 AM
Willy Denoyette [MVP]
Or better, use CoFreeUnusedLibraries, this one doesn't require a instance
handle.

Willy.

Show quote
"Mattias Sjögren" <mattias.dont.want.spam@mvps.org> wrote in message
news:ekU4zwZBGHA.3580@TK2MSFTNGP11.phx.gbl...
>
>>Has anybody a solution for my problem?
>
> You can try calling the FreeLibrary API to release the library when
> you're done. Or do the unregistering in a separate process so you
> don't have to load the library into your own.
>
>
> Mattias
>
> --
> Mattias Sjögren [C# MVP]  mattias @ mvps.org
> http://www.msjogren.net/dotnet/ | http://www.dotnetinterop.com
> Please reply only to the newsgroup.
Author
21 Dec 2005 9:48 AM
Albert Krüger
Thanks, I try it.

Albert

Show quote
"Willy Denoyette [MVP]" <willy.denoye***@telenet.be> schrieb im Newsbeitrag
news:uCffGHcBGHA.216@TK2MSFTNGP15.phx.gbl...
> Or better, use CoFreeUnusedLibraries, this one doesn't require a instance
> handle.
>
> Willy.
>
> "Mattias Sjögren" <mattias.dont.want.spam@mvps.org> wrote in message
> news:ekU4zwZBGHA.3580@TK2MSFTNGP11.phx.gbl...
>>
>>>Has anybody a solution for my problem?
>>
>> You can try calling the FreeLibrary API to release the library when
>> you're done. Or do the unregistering in a separate process so you
>> don't have to load the library into your own.
>>
>>
>> Mattias
>>
>> --
>> Mattias Sjögren [C# MVP]  mattias @ mvps.org
>> http://www.msjogren.net/dotnet/ | http://www.dotnetinterop.com
>> Please reply only to the newsgroup.
>
>

AddThis Social Bookmark Button