В API-Guide нашёл следующий код:
- Код: Выделить всё
Option Explicit
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) 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 Const ERROR_SUCCESS = &H0
Public Function RegisterServer(hWnd As Long, DllServerPath As String, bRegister As Boolean)
On Error Resume Next
Dim lb As Long, pa As Long
lb = LoadLibrary(DllServerPath)
If bRegister Then
pa = GetProcAddress(lb, "DllRegisterServer")
Else
pa = GetProcAddress(lb, "DllUnregisterServer")
End If
If CallWindowProc(pa, hWnd, ByVal 0&, ByVal 0&, ByVal 0&) = ERROR_SUCCESS Then
MsgBox IIf(bRegister = True, "Registration", "Unregistration") + " Successful"
Else
MsgBox IIf(bRegister = True, "Registration", "Unregistration") + " Unsuccessful"
End If
'unmap the library's address
FreeLibrary lb
End Function
В нём указана функция регистраци/отмены регистрации OCX/DLL.
Одним и параметров является является хендл окна: hWnd As Long.
При написании программ, я обычно выношу функции и процедуры в модули.
Такие аргументы я переношу в тело функции следующим образом:
- Код: Выделить всё
Screen.ActiveForm.hWnd
Всё прекрасно работает и, в IDE и, в скомпилированном проекте. Но стоит функцию пренести в ActiveX dll - она престаёт работать.
Поясните почему?
(Моё мнение, возможно ошибочное - нет активного окна для которого указывается хендл) - это можно как-то победить?
С уважением...