Dll 库未注册,Windows XP

Dll 库未注册,Windows XP,dll,vb6,registry,dllregistration,Dll,Vb6,Registry,Dllregistration,使用VB6,我无法更改为VB.NET或其他任何内容 我试图以调用应用程序的Form\u Load方法编程注册COM库 我下面使用的方法在Windows7(x86和x64)上的效果与预期一样。但是,当我尝试在Windows XP上使用相同的应用程序时,我收到库未注册错误: 我已验证该库是否已注册,并在HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MyDll.Component的注册表中以及HKEY_Classes\u ROOT\AppID\MyDll.DLL中正确显示 这

使用VB6,我无法更改为VB.NET或其他任何内容

我试图以调用应用程序的Form\u Load方法编程注册COM库

我下面使用的方法在Windows7(x86和x64)上的效果与预期一样。但是,当我尝试在Windows XP上使用相同的应用程序时,我收到库未注册错误:

我已验证该库是否已注册,并在HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MyDll.Component的注册表中以及HKEY_Classes\u ROOT\AppID\MyDll.DLL中正确显示

这是我正在使用的代码,有人能告诉我为什么这只会发生在XP上,以及如何解决它吗

Private Declare Function DllRegisterServer Lib "MyDLL.dll" () As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As       Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Any, ByVal wParam As Any, ByVal lParam As Any) As Long

Private Sub Form_Load()
ReDim ConfigFiles(0)
ReDim ConfigFilesToAdd(0)

libID = LoadLibrary("MyDLL.dll")

Dim pAdd As Long
pAdd = GetProcAddress(libID, "DllRegisterServer")

Dim lResult As Long
lResult = CallWindowProc(pAdd, 0&, 0&, 0&, 0&)

Set IGDep = CreateObject(MyDLL.Component")

End Sub
我已使用包括管理员帐户在内的所有权限执行此过程,并确保我拥有注册表的所有权限


感谢大家提供的帮助。

DLLRegisterServer不是一个窗口进程,CallWindowProc需要一个窗口句柄HWND作为第一个参数。你为什么要调用CallWindowProc?DLLRegisterServer是一个函数,而不是句柄。这个代码完全错误。CallWindowProc需要一个窗口句柄和四个参数,而不是指向函数的指针。这段代码不应该在任何版本的Windows上运行,我怀疑它实际上从未运行过;您看到在任何系统上注册的DLL可能是其他注册它的结果。使用CallWindowProc是一种常见的可怕的黑客行为,用于调用函数指针,因为它的实现将任意运行它传递的任何内容。不幸的是,我被告知要这样做,因为调用有时会出现问题直接使用DllRegisterServer。我本来就是这么做的,但有人告诉我不能那样做。无论如何,即使直接使用DllRegisterServer,我仍然会收到相同的错误。还有其他想法吗?我发现问题在于CreateObject调用。在Windows7上,它正确地返回一个对象/组件,该对象/组件包含该组件应具有的所有内容。然而,在XP上,它只是创建了一个通用对象。有人知道为什么会这样吗?CreateObject不能用于XP上的特定类型吗?