Страница: 1 | 2 |
Вот так: Когда я писал DLL на асме, у меня такой глюк возникал из-за того, что я не написал файл DEF с объявлениями функций. Может в этом дело? Можешь писать и по нормальному, но следует писать Alias и название функции, как она будет вызываться из dll. Возми, к примеру, PE Explorer, или др. вещь которая смотрит экспортируемые функции, там сразу видно что да как... 2Sharp, DEF файл, на сколько я знаю еще и в VC пользуеться... А в PB ничего такого не предусмотрено, там попросту пишешь в конце Export и название как вызывать эту самую АПИ, ну в общем аналог DEF, только прям в коде )) Чем мне он и нравится )) А как вызов АПИ, так же как в ВБ? А то что -то одна ф-ция работает, которая не нужна, а которая нужна - нет. Такой примерчик FUNCTION MyFunction1(BYVAL Param1 AS LONG) EXPORT AS LONG GetLasError возвращает ошибку код 1400. При вызове такиv способом: retval = MYFUNCTION1 (Me.hWND, 0,0,500,500,1) retval=1400 описания ошибки 1400 не нашёл нигде. Но судя по всему неверный хэндл, я так думаю. Хотя тип указан как лонг и по справочнику он совпадает с ВБ-лонг. Может кто знает, какая это ошибка? Оказывается, нет. Вдруг заработало и с ByVal и без него. А что было - не понял.... А возвращаясь к регистрации, можно ли с уверенностью сказать, что если DLL не подключается к проекту через меню Ссылки, то это чистая DLL, а если её можно подключить - то это ActiveX. И если нет, то как определить, есть ли у нее DLLRegisterServer и соответственно, надо ли регистрировать? Слушай, а почему ты ее вызываешь у тя параметров много, а в длл, параметров явно меньше! Ты проверь MsgBоx'ом что ты получаешь в качестве параметра1 и сравни с тем что отсылаешь! Может поможет... Я же говорю, попробуй воспользоваться PE Explorer'ом, достаточно универсальная тулза... Да то просто опечатка, естественно я не передаю туда координаты, иначе функция не возвращала бы номер от GetLastError, да и IDE VB не пропустит такого. В общем работает, вызывается АПИ как обычно. А у тебя нет ссылки на эту штуку -PE Explorer? Посмотри на vano.t-k.ru там имеется, уже вылеченный Рома и cresta, ошибки можно смотреть, по их номеру, используя FormatMessage, вот хоть например так:
Вопрос: DLL
Добавлено: 22.01.04 20:39
Автор вопроса: cresta
Написал маленькую DLL с одной функцией
FUNCTION MyFunction1(BYVAL lValue AS LONG) EXPORT AS LONG
FUNCTION = lValue * 10
END FUNCTION
Откомпилировал в A.dll. Положил её в системную папку, в модуле задекларировал так:
Declare Function MyFunction1 Lib "A.dll" (ByVal lValue As Long) As Long
вызываю так:
dim lValue as long: lValue = 2
retval = MyFunction1(ByVal lValue)
при вызове функции ошибка 453: Невозможно найти допуск в DLL MyFunction1 in A.dll.
Пробовал декларировать с Alias "MyFunction1A" - не помогло. Вызываю без ByVal - та же история.
Где может быть ошибка? Може опять 16-битные заморочки РВ?
Ответы
Всего ответов: 19
Номер ответа: 1
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #1
Добавлено: 22.01.04 20:59
FUNCTION MyFunction1 Alias "MyFunction1"(BYVAL lValue AS LONG) EXPORT AS LONG
Можно и по старому но в ВБ имя функции необ-мо писать заглавными (используется по умолчанию), т.е. Declare Function MYFUNCTION1 Lib "A.dll" (ByVal lValue As Long) As Long
Номер ответа: 2
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #2
Добавлено: 22.01.04 22:04
Номер ответа: 3
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #3
Добавлено: 22.01.04 22:46
To sne: спасибо, помогло, только не понял, почему именно заглавные буквы, для АПИ ведь такого нет, какая разница? Я когда делал ActiveX DLL, такого не было, чтоб в верхнем регистре надо декларировать.
To Sharp: а что за файл такой DEF ?
И ещё, DLL надо регистрировать или нет? ActiveX DLL понятно, а просто DLL?
Номер ответа: 4
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #4
Добавлено: 23.01.04 00:39
Номер ответа: 5
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #5
Добавлено: 23.01.04 01:11
Номер ответа: 6
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #6
Добавлено: 23.01.04 02:04
Ничего регить не надо, это 100% DLL, которые можно пользовать! Вот этой-то самой фичи мне в VB более всего и не хватало
Номер ответа: 7
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #7
Добавлено: 23.01.04 02:11
LOCAL hResult AS LONG
hResult = MoveWindow (Param1, 0, 0, 200, 200, 1)
IF hResult = 0 THEN
FUNCTION = GetLastError
BEEP
ELSE
FUNCTION = hResult
END IF
END FUNCTION
Номер ответа: 8
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #8
Добавлено: 23.01.04 02:31
VB по умолчанию передает указатель по ссылке, так что, имхо, причина в том, что ты передаешь не хандл, а указатель на него. Попробуй ByVal Me.hWnd
Номер ответа: 9
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #9
Добавлено: 23.01.04 03:21
Номер ответа: 10
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #10
Добавлено: 23.01.04 03:38
Номер ответа: 11
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #11
Добавлено: 23.01.04 03:40
Номер ответа: 12
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #12
Добавлено: 23.01.04 05:06
Номер ответа: 13
Автор ответа:
POMAH
ICQ: 223-574-928
Вопросов: 0
Ответов: 16
Профиль | | #13
Добавлено: 23.01.04 09:46
cresta! Насчет ошибки 1400 ты абсолютно прав: "Недопустимый дескриптор окна". А чтобы легче узнавать чего за ошибка используй Error Lookup, поставляемый вместе с Visual Studio
Номер ответа: 14
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #14
Добавлено: 23.01.04 10:25
Номер ответа: 15
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #15
Добавлено: 23.01.04 10:28
Public Function VBGetLastError(ByVal id As Long) As String
Dim lStr As Long
VBGetLastError = Space$(512)
lStr = FormatMessage(&H1000, 0&, id, 0&, VBGetLastError, Len(VBGetLastError), 0&)
VBGetLastError = Left$(VBGetLastError, lStr)
End Function