Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Power Basic

Страница: 1 | 2 |

 

  Вопрос: 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-сайт: hw.t-k.ru
 Профиль | | #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-сайт: sharpc.livejournal.com
 Профиль | | #2
Добавлено: 22.01.04 22:04

Когда я писал DLL на асме, у меня такой глюк возникал из-за того, что я не написал файл DEF с объявлениями функций. Может в этом дело?

Ответить

Номер ответа: 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-сайт: sharpc.livejournal.com
 Профиль | | #4
Добавлено: 23.01.04 00:39
В файле DEF (по крайней мере в MASM32) пишутся объявления всех функций, которые можно вызывать в этой библиотеке. Может, PB это делает самостоятельно, а может и нет, надо проверить.
Обычную DLL, насколько мне известно, регистрировать не надо, т.к. в них никогда не пишут DllRegisterServer (я, конечно, перемешал причину и следствие, но истина где-то рядом).

Ответить

Номер ответа: 5
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #5
Добавлено: 23.01.04 01:11

Можешь писать и по нормальному, но следует писать Alias и название функции, как она будет вызываться из dll. Возми, к примеру, PE Explorer, или др. вещь которая смотрит экспортируемые функции, там сразу видно что да как...

Ответить

Номер ответа: 6
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #6
Добавлено: 23.01.04 02:04

2Sharp, DEF файл, на сколько я знаю еще и в VC пользуеться... А в PB ничего такого не предусмотрено, там попросту пишешь в конце Export и название как вызывать эту самую АПИ, ну в общем аналог DEF, только прям в коде :))) Чем мне он и нравится :)))

Ничего регить не надо, это 100% DLL, которые можно пользовать! Вот этой-то самой фичи мне в VB более всего и не хватало :)

Ответить

Номер ответа: 7
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #7 Добавлено: 23.01.04 02:11

 А как вызов АПИ, так же как в ВБ? А то что -то одна ф-ция работает, которая не нужна, а которая нужна - нет. Такой примерчик

FUNCTION MyFunction1(BYVAL Param1 AS LONG) EXPORT AS LONG
    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

GetLasError возвращает ошибку код 1400. При вызове такиv способом:

retval = MYFUNCTION1 (Me.hWND, 0,0,500,500,1)

retval=1400 

описания ошибки 1400  не нашёл нигде. Но судя по всему неверный хэндл, я так думаю. Хотя тип указан как лонг и по справочнику он совпадает с ВБ-лонг. Может кто знает, какая это ошибка?

 

Ответить

Номер ответа: 8
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #8
Добавлено: 23.01.04 02:31
VB по умолчанию передает указатель по ссылке, так что, имхо, причина в том, что ты передаешь не хандл, а указатель на него. Попробуй ByVal Me.hWnd

Ответить

Номер ответа: 9
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #9 Добавлено: 23.01.04 03:21

Оказывается, нет. Вдруг заработало и с ByVal  и без него. А что было - не понял....

А возвращаясь к регистрации, можно ли с уверенностью сказать, что если DLL не подключается к проекту через меню Ссылки, то это чистая DLL, а если её можно подключить - то это ActiveX. И если нет, то как определить, есть ли у нее DLLRegisterServer и соответственно, надо ли регистрировать?

Ответить

Номер ответа: 10
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #10
Добавлено: 23.01.04 03:38

Слушай, а почему ты ее вызываешь у тя параметров много, а в длл, параметров явно меньше! Ты проверь MsgBоx'ом что ты получаешь в качестве параметра1 и сравни с тем что отсылаешь! Может поможет...

Ответить

Номер ответа: 11
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #11
Добавлено: 23.01.04 03:40

Я же говорю, попробуй воспользоваться PE Explorer'ом, достаточно универсальная тулза...

Ответить

Номер ответа: 12
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #12 Добавлено: 23.01.04 05:06

Да то просто опечатка, естественно я не передаю туда координаты, иначе функция не возвращала бы номер от GetLastError,  да и IDE VB не пропустит такого. В общем работает, вызывается АПИ как обычно.

А у тебя нет ссылки на эту штуку -PE Explorer?

Ответить

Номер ответа: 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-сайт: hw.t-k.ru
 Профиль | | #14
Добавлено: 23.01.04 10:25

Посмотри на vano.t-k.ru там имеется, уже вылеченный :)

Ответить

Номер ответа: 15
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #15
Добавлено: 23.01.04 10:28

Рома и cresta, ошибки можно смотреть, по их номеру, используя FormatMessage, вот хоть например так:

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

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам