Перемещении аргумета функции, в тело функции

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Diamock
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 26.10.2009 (Пн) 4:19
Откуда: Кемерово

Перемещении аргумета функции, в тело функции

Сообщение Diamock » 07.02.2010 (Вс) 14:15

Здравствуйте Уважаемые!
В 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 - она престаёт работать.
Поясните почему?
(Моё мнение, возможно ошибочное - нет активного окна для которого указывается хендл) - это можно как-то победить?

С уважением...
In der Beschrankung zeigt sich erst der Meister
Графоманю...

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Перемещении аргумета функции, в тело функции

Сообщение iGrok » 07.02.2010 (Вс) 14:26

А указание нуля вместо hWnd не прокатывает?
label:
cli
jmp label

Diamock
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 26.10.2009 (Пн) 4:19
Откуда: Кемерово

Re: Перемещении аргумета функции, в тело функции

Сообщение Diamock » 07.02.2010 (Вс) 14:32

iGrok писал(а):А указание нуля вместо hWnd не прокатывает?

Уважаемый iGrok!
Использовать ноль, не пробовал. Просто не додумался до этого. Спасибо за совет, попробую.

Добавлено позже.

Попробовал, протестировал - всё работает. iGrok, большое спасибо за совет!

Добавлено ещё позже.

Уважаемые! Разъясните!
Почему именно ноль?

С уважением...
In der Beschrankung zeigt sich erst der Meister
Графоманю...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Перемещении аргумета функции, в тело функции

Сообщение Хакер » 07.02.2010 (Вс) 17:44

Ужаснейший код. Чудовищный. Да и сам вопрос и формулировки не лучше.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Diamock
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 26.10.2009 (Пн) 4:19
Откуда: Кемерово

Re: Перемещении аргумета функции, в тело функции

Сообщение Diamock » 07.02.2010 (Вс) 18:47

Хакер писал(а):Ужаснейший код. Чудовищный. Да и сам вопрос и формулировки не лучше.

Уважаемый Хакер!
Разъясните пожалуйста почему.
Почему ужаснейший и чудовищный?
И, что не так с формулировкой?
С уважением...
In der Beschrankung zeigt sich erst der Meister
Графоманю...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Перемещении аргумета функции, в тело функции

Сообщение Хакер » 07.02.2010 (Вс) 19:24

Потому что функции ожидают получить ноль аргументов, а ты их вызываешь так, как будто они получают 4 аргумента. Это может привести к непредсказуемым печальным последствиям.

А формулировки ужасные... ну как тут объяснишь. Ужасные и всё тут. Например, начни с того, что объяснишь смысл запятой в названии темы. Она какую функцию выполняет?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Diamock
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 26.10.2009 (Пн) 4:19
Откуда: Кемерово

Re: Перемещении аргумета функции, в тело функции

Сообщение Diamock » 07.02.2010 (Вс) 20:41

Уважаемый Хакер!
Спасибо, что разъяснил. Больше не буду изобретать велосипед, ни с квадратными колёсами, ни с треугольными. :oops:
In der Beschrankung zeigt sich erst der Meister
Графоманю...

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Перемещении аргумета функции, в тело функции

Сообщение iGrok » 07.02.2010 (Вс) 22:52

Diamock писал(а):Почему именно ноль?

Ноль - потому же, почему указаны нули вместо всех остальных параметров.
Вызываемой функции не нужен никакой hWnd. Так зачем его откуда-то брать?

В остальном всё расписал Хакер. API-Guide почему-то предлагает очень странные решения.
Поищи по форуму вызов ф-ции по указателю. Может, один из предлагаемых вариантов тебя устроит.
label:
cli
jmp label

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Перемещении аргумета функции, в тело функции

Сообщение Хакер » 07.02.2010 (Вс) 23:12

Дык, в том же FNDLL делается подобный вызов: только не DllRegisterServer, а DllGetClassObject.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 19

    TopList