Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Проблема с загрузкой ДЛЛ


Автор: Burka 5.12.2008, 18:51
Пытаюсь загрузить в делфи библиотеку windbr32.dll, написанную на С/С++(вроде с++).

Если вызывать функции статическимм методом
Код

Function MdbOpen(hWnd:Thandle):Thandle; safecall; external 'windbr32';

И (это важно) если вызывать где нибудь в коде эту функцию то программа вроде как и запускается, но форма не появляется и виснет.

Пробовал загружать библиотеку динамически
Код

Type
 TMdbOpen = function(hWnd:Thandle):Thandle;
...

procedure TForm1.Button2Click(Sender: TObject);
var
  DLLInstance : THandle;
  MdbOpen : TMdbOpen;
begin
{ загружаем DLL }
DLLInstance := LoadLibrary(Pchar(Edit3.Text));
{ получаем указатель }
//@MdbOpen := GetProcAddress(DLLInstance, 'MdbOpen');
{ вызываем процедуру на выполнение }
//HDB:=MDBOpen(Hwnd);
{ выгружаем DLL из оперативной памяти }
FreeLibrary(DLLInstance);
end;

Эффект примерно такой же, программа виснет после нажатия на кнопку загрузки библиотеки. Проверял с другими длл загружаются без проблем.
Подскажите как разобратся в проблеме? 

в приложении заголовочный сишный файл, если вдруг чем поможет.

Автор: bems 5.12.2008, 19:09
вместо safecall попробуй stdcall

Автор: Burka 5.12.2008, 20:22
я все перепробовал и cdecl и stdcall и многое другое, результат не изменился.

Автор: cemick 6.12.2008, 00:45
после выполнения какого строки виснет форма???

Автор: Burka 6.12.2008, 01:10
cemick,
Код

DLLInstance := LoadLibrary(Pchar(Edit3.Text));

Автор: Akella 6.12.2008, 10:07
А может проблема НЕ в способе вызозва библиотеки?

Автор: Burka 6.12.2008, 13:54
Цитата
А может проблема НЕ в способе вызозва библиотеки?

Ну если прога виснет в обоих случаях то проблема либо с библиотекой, либо есть проблема загрузки из делфи, я хочу попробовать загрузить с помощью C++ Builder. Хотя по идее функция загрузки  все равно одна и таже используется.
Надо убедится что это именно в библиотеке проблема, но как это проверить я не знаю.


Автор: Christoph 6.12.2008, 17:52
Попробуй проверку сделать

Код

DLLInstance := LoadLibrary(Pchar(Edit3.Text));
if DLLInstance >=32 then
...
else // Иначе ошибка



Кста покажи длл

Автор: Burka 6.12.2008, 18:02
Christoph, проблема в том что любой код после загрузки библиотеки уже Не исполняется. Даже с TRY EXCEPT прога виснет, но ошибки никакой не выдает.
Код

try
{ загружаем DLL }
DLLInstance := LoadLibrary(Pchar(Edit3.Text));
except
SHowMessage('Это сообщение не выскакивает');
end;
SHowMessage('и это тоже');


Добавлено через 3 минуты и 41 секунду
http://slil.ru/26407098 вот эта длл-ка ~500кб

Автор: THandle 6.12.2008, 19:53
У меня эта ваша библиотечка кинула следующее(в аттаче).

Автор: Burka 6.12.2008, 21:02
THandle, это хорошо что она ошибки выдает)

Автор: Christoph 6.12.2008, 21:36
тут весь прикол в том что ты не можешь загрузить эту dll, пока не будут найдены все импортируемые бибилотеки, глянул список импортируемых библотек: 

KERNEL32.dll
WSOCK32.dll
USER32.dll
MSVCRT.dll
wmeteo32.dll - не хватало этой длл, но всеравно не пашет :( а может быть такое что этот длл зависит от ехешника?!

Ничего не пойму..

Автор: Burka 6.12.2008, 22:03
Цитата

а может быть такое что этот длл зависит от ехешника?!

Врятли, эту библиотеки прислали из москвы, в них функции для работы со специфической метео базой. То есть по идее они как раз для разработки, и не должны к конкретному экзешнику быть привязаны.

Автор: Christoph 6.12.2008, 22:29
Тут один вариант, эта библиотека привязана к ехешнику smile других вариантов нет

Автор: Burka 6.12.2008, 22:38
ТО есть он должын быть рядом с библиотекой или нельзя вызвать функции из нее?

Автор: MetalFan 6.12.2008, 22:49
Цитата(Burka @  5.12.2008,  20:22 Найти цитируемый пост)
я все перепробовал и cdecl и stdcall и многое другое

разве много разных вариантов декларации функции?))

Автор: Christoph 6.12.2008, 22:52
Наверное должен быть запущен ехешник которые работает с библиотекой wmeteo32.dll , затем уже подключать windbr32, а у тебя есть ехешник? Потому что я читал этот wmeteo32.dll идет в каком то пакете...

Автор: MetalFan 6.12.2008, 23:16
библиотека windbr32 грузится норм... что я не так делаю? )

Автор: Burka 6.12.2008, 23:30
Цитата

разве много разных вариантов декларации функции?))

Вроде еще две =)

Цитата

библиотека windbr32 грузится норм... что я не так делаю? )

вот тоже хотелось бы знать, а код такой же?

Автор: Akella 7.12.2008, 01:14
Цитата(MetalFan @  6.12.2008,  23:16 Найти цитируемый пост)
библиотека windbr32 грузится норм... что я не так делаю? ) 

не удержался  от оффтопа smile  smile  smile

Добавлено через 1 минуту и 35 секунд
Цитата(Burka @  6.12.2008,  22:03 Найти цитируемый пост)
эту библиотеки прислали из москвы

А описания к ней не выслали?

Автор: Burka 7.12.2008, 01:55
Цитата

А описания к ней не выслали?

Есть подробное описание функций библиотеки. Особеностей подключения и тп нету. 

Вот список файлов который был с этими библиотеками:
windbr32.dll
windbr32.doc (не понятный текст в не понятной кодирофке =) )
windbr32.lib вот мне кажется что она нужна для библиотеки но использовать ее я так понимаю тока из си получится, мб я ошибаюсь.
windrexp.h
wmeteo32.dll
wmeteo32.lib

Автор: MetalFan 7.12.2008, 10:45
Цитата(Burka @  6.12.2008,  23:30 Найти цитируемый пост)
вот тоже хотелось бы знать, а код такой же?

код из первого твоего поста.
вощем поковыряв библиотеку пришел к выводу (на сколько мне позволяют знания асм-а), что при загрузке библиотеки создается доп.поток, в котором что-то происходит и этого чего-то ждет поток, загружающий библиотеку. соотв. LoadLibrary не вернется, пока эта операция не закончится.... но после 3-4 запусков с попыткой расковырять, что там происходит, библиотека стала грузится без задержки. вот.
может грузить библиотеку в доп.потоке? шоб основной не "тупил" пока там что-то проинициализируется....

Автор: CodeMonkey 7.12.2008, 13:54
Цитата(Burka @  7.12.2008,  01:55 Найти цитируемый пост)
windbr32.doc

Лучше бы вы вот это выложили. Это ж доки.

Автор: Burka 7.12.2008, 14:30
MetalFan, можно попробовать, только я с потоками не имел дела, можно пример кода выложить?

CodeMonkey, вот этот док, если честно на мануал не очень похоже


Автор: bems 7.12.2008, 17:14
это документ новой версии ворда. на сайте мелкософта есть надстройка для старых версий, чтобы открывать новые

Автор: Burka 7.12.2008, 17:40
Цитата

это документ новой версии ворда. на сайте мелкософта есть надстройка для старых версий, чтобы открывать новые

а поподробнее можно, ссылку или хотя бы название этой надстройки. А то я ничего такого не нашел.

Автор: bems 7.12.2008, 17:55
нету у меня ссылки и надстройку установил и забыл. Вот тебе документ, которому я сделал "сохранить как". Вроде все нормально сохранилось, но ворд ругался что могут быть потери, так что извини коль что не так

Автор: Burka 7.12.2008, 18:22
bems, спасибо. Это как раз то описание функций о котором я говорил, тока оно в распечатанном виде у меня было.

Автор: Burka 8.12.2008, 12:56
Попробовал загрузить в отдельном потоке, программа повисела минуту и выдала ошибку
"HASP Driver not installed or old Driver version (-100)"

MetalFan, раз у тебя загрузилась без проблем значит у тебя есть этот драйвер?  И что это вообще за драйвер такой? щас нет возможности погуглить.

Автор: CodeMonkey 8.12.2008, 14:07
Цитата(Burka @  8.12.2008,  12:56 Найти цитируемый пост)
Попробовал загрузить в отдельном потоке, программа повисела минуту и выдала ошибку"HASP Driver not installed or old Driver version (-100)"


Цитата("wiki")
HASP (англ. Hardware Against Software Piracy) - это мультиплатформенная аппаратно-программная система защиты программ и данных от нелегального использования и несанкционированного распространения разработанная компанией Aladdin Knowledge Systems Ltd. По утверждению www.softkey.info на 2005 год являлся одним из самых широкоприменяемых аппаратных средств для защиты ПО.

Защита HASP включает в себя:
электронный ключ HASP;
специальное программное обеспечение для «привязки» к электронному ключу, защиты приложений и для кодирования данных;
схемы и методы защиты программ и данных, обнаружения и борьбы с отладчиками, контроля целостности программного кода и данных.

HASP поддерживает большинство платформ, операционных систем и обеспечивает разработчикам широкий набор средств для защиты программного обеспечения.

Электронные ключи HASP выпускаются в различных исполнениях:
USB-брелок;
LPT-ключ с возможностью «прозрачного» подключения других ключей и устройств;
PCMCIA-карта;
Внутренняя плата стандарта PCI и ISA.


Короче, у вас она ключ искала-искала и не нашла ;)

Автор: Akella 8.12.2008, 14:09
Цитата(Burka @  8.12.2008,  12:56 Найти цитируемый пост)
"HASP Driver not installed or old Driver version (-100)"

вооооот где собака порылась... библиотека ищет ключ защиты

HASP не знаешь что такое?  smile 

http://www.aladdin.com/support/hasp/enduser.aspx - это для йвер для ключа, типа как у 1С-ки

Добавлено через 56 секунд
А что же это тебе из Москвы прислали библиотеку... доку... а ключ и не прислали  smile 

Автор: Burka 8.12.2008, 14:43
Цитата

А что же это тебе из Москвы прислали библиотеку... доку... а ключ и не прислали

Меня больше интересует как библиотека у MetalFan'a она загрузилась smile
Присылали не мне и уже давно, а я тока с файлами разбираюсь.

Ну хоть теперь понятно в чем проблема, будем разбираться.



Автор: MetalFan 8.12.2008, 15:05
Burka, фиг знает, как загрузилась... никаких обращений к хаспам не заметил, даже эмулятор не стоит, не то, что ключ

Автор: Akella 8.12.2008, 22:24
Значит скажи этим москвичам, чтобы они предусмотрели показ ошибки  с нормальным текстом.

Автор: Shaian 28.1.2011, 07:35
Ура!!! Нашел людей кто сталкивался с этим чудом программерской мысли Windbr32.dll. Оживляю тему. Помогите кто может. Функция MdbGetData из этой dll. Вот описание этой функции:

MdbGetData (hDB, lpdbData) : bFound
Назначение    С помощью функции MdbGetData можно просмотреть все данные из отобранной записи, соответствующие заказу на данные. Сразу после вызовов функций MdbNext или MdbDataReset функция MdbGetData начинает просмотр записи с самого начала. Последующие вызовы MdbGetData продолжают просмотр записи. 
Параметры    hDB - идентификатор сессии доступа, lpdbData - длинный указатель на структуру типа MDBDATA, в которой функция заполнит поля pname - имя параметра, value - его значение, check - сведения о контроле значения параметра и diff - поправка к значению параметра.
Результат    Если при очередном вызове MdbGetData будет достигнут конец записи, то функция вернет FALSE и структура, на которую указывает lpdbData, не будет заполнена. Если данные отобраны, то возвращается TRUE.

Ситуация такая, если данных в записи нет то функция возвращает false и все в порядке, но если запись не пустая то прога вылетает.
 В чем собака порылась? Приведите кто может плиз, пример рабочего кода с этой функцией.

Автор: Juiko 5.10.2011, 12:12
ой, и Вы тоже с этим ужасом столкнулись)))
мне тут выдали пару дней назад дописывать прогу..программа работет где угодно, кроме моего компьютера..и всё на эти dll'ки ругается...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)