Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.12;
Скачать: CL | DM;

Вниз

загрузка dll-ки   Найти похожие ветки 

 
_Guest_   (2006-09-29 18:01) [0]

Гружу dll-ку: LoadLibrary(dll); все нормально. Хочу упростить код и вынести поиск файла библиотеки, а затем и загрузку в отдельную процедуру (или функцию - без разницы). И тут начинаются чудеса: ошибка обращения в никуда. Если поставить в отладчике точку останова и выполнять пошагово - снова все нормально. Снова выношу этот кусок кода в TForm.Create - опять все работает. Кто знает, объясните в чем дело.

PS пора перебираться в форум для начинающих, ничего уже не понимаю.


 
Palladin ©   (2006-09-29 18:08) [1]


> Хочу упростить код и вынести поиск файла библиотеки,

А как ты это хочешь? Кто может понять чего ты там натворил и как это выглядит? В гости к тебе заявиться и на экран посмотреть?


 
Dmitrij_K   (2006-09-29 18:12) [2]

Для начала покажи код.


 
_Guest_   (2006-09-29 18:21) [3]


procedure LibraryLoad(NameFile : TFileName; var Handle  : THandle);
var
 NF, Dirs : String;
 Dst : PChar;
begin
 

 {Этот кусок просто ищет файл}
 Dirs := MProject.GetDirectories(sftLibrary);
 NF := CheckFile(NameFile, Dirs);
 Dst := "";
 Dst := StrPCopy(Dst, Nf);
 {}
 
 if NF <> "" then
 begin
   Handle := LoadLibrary(Dst);
   if Handle = 0 then
     messagedlg("Не могу загрузить " + NameFile + " !", mtWarning, [mbOk], 0);
 end else
 begin
   Handle := 0;
   messagedlg("Не могу найти " + NameFile + " !", mtWarning, [mbOk], 0);
 end;
 LibDbf := Handle <> 0;
end;

Использую эту процедуру при создании главной формы: LibraryLoad("OdbfInfo.dll", OdbfInfo_Handle)
Освобождаю библиотеку при выходе


 
Джо ©   (2006-09-29 18:27) [4]

StrPCopy function
---
The destination buffer must have room for at least Length(Source)+1 characters.

(c) Delphi Help.


 
@!!ex ©   (2006-09-29 18:28) [5]

TFileName
THandle
....
А INteger и String  не рулят?

P.S.
Какой то странный код.... ИМХО


 
_Guest_   (2006-09-29 18:34) [6]


> Джо ©   (29.09.06 18:27) [4]
> StrPCopy function
> The destination buffer must have room for at least Length(Source)+1
> characters.
> (c) Delphi Help.

При чем тут StrPCopy ? Я вместо Dst могу "OdbfInfo.dll" прямо в вызове прописать - результат тот же самый.

> @!!ex ©   (29.09.06 18:28) [5]
> TFileName
> THandle
> А INteger и String  не рулят?

THandle не Integer,  а Word по-моему, а аргумент у  LoadLibrary не String, а PChar. Еще отмазы ? :)


 
Джо ©   (2006-09-29 18:38) [7]

> [6] _Guest_   (29.09.06 18:34)
> При чем тут StrPCopy ?

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


 
Джо ©   (2006-09-29 18:39) [8]

_Guest_  
> THandle не Integer,  а Word по-моему


THandle = LongWord;

(с) SystemPas. Коль пошла такая пьянка.


 
_Guest_   (2006-09-29 18:48) [9]

Согласен, а теперь:

procedure LibraryLoad(var Handle  : THandle);
begin
  Handle := LoadLibrary("odbfinfo.dll");
  if Handle = 0 then
    messagedlg("Не могу загрузить " + NameFile + " !", mtWarning, [mbOk], 0);
end;

Выполнение приводит к "Access violation at adress..."  ?


 
Palladin ©   (2006-09-29 18:51) [10]

в этой процедуре ошибки нет, она в другом месте...


 
_Guest_   (2006-09-29 18:51) [11]

Извиняюсь(тороплюсь):
procedure LibraryLoad(var Handle  : THandle);
begin
 Handle := LoadLibrary("odbfinfo.dll");
 if Handle = 0 then
   messagedlg("Не могу загрузить odbfinfo.dll !", mtWarning, [mbOk], 0);
end;


> Джо ©   (29.09.06 18:39) [8]
>
> THandle = LongWord;
>
> (с) SystemPas. Коль пошла такая пьянка.
>

Конечно. Но тем не менее?


 
@!!ex ©   (2006-09-29 18:54) [12]

procedure LibraryLoad(var Handle  : THandle);
begin
try
Handle := LoadLibrary("odbfinfo.dll");
if Handle = 0 then
  messagedlg("Не могу загрузить odbfinfo.dll !", mtWarning, [mbOk], 0);
except
 ShowMessage("Багалага");
end;
end;


 
Джо ©   (2006-09-29 18:55) [13]

> [9] _Guest_   (29.09.06 18:48)
> Выполнение приводит к "Access violation at adress..."  ?

У меня не приводит. И вряд ли сможет привести у кого-то другого. Смотри на окружающий код.


 
Джо ©   (2006-09-29 18:56) [14]

> Конечно. Но тем не менее?

Просто уточняю. Лично я всегда использую именно THandle.


 
@!!ex ©   (2006-09-29 19:00) [15]

Ну если пустится в демагогию, то ЛоадЛибрарий вообще не с хэндлом работает, а с инстансом. :)
И в дельфе тип требуется HMODULE....
Ну это так, оффтоп..

По теме:
Код нормальный и ничего там не может ломатся.......  в обычных условиях.
Где то в другом месте ошибка.
Например в самой дллке.


 
_Guest_   (2006-09-29 19:01) [16]


> Джо ©   (29.09.06 18:55) [13]
>
> > [9] _Guest_   (29.09.06 18:48)
> > Выполнение приводит к "Access violation at adress..."
>  ?
>
> У меня не приводит. И вряд ли сможет привести у кого-то
> другого. Смотри на окружающий код.

Втом то и дело, что если я весь этот код пшу в TFormMain.Create то и у меня не приводит. А если в отдельную процедуру, и уже вызов ее из TFormMain.Create, тогда приводит. Все, вечер-пятница уже и глаза и мозги замылены. Не понимаю что происходит.


 
_Guest_   (2006-09-29 19:06) [17]


> @!!ex ©   (29.09.06 19:00) [15]
>
> По теме:
> Код нормальный и ничего там не может ломатся.......  в обычных
> условиях.
> Где то в другом месте ошибка.
> Например в самой дллке.

Спасибо. Почему же когда отладчиком останавливаю, то все отрабатывает. Иесли гружу dll-ку из другой программы - тоже. Вряд ли дело в библиотеке.:(


 
Джо ©   (2006-09-29 19:11) [18]

Неужели сложно пройтись отладчиком пошагово и установить точно, в какой именно строке вылезает AV?


 
Джо ©   (2006-09-29 19:12) [19]

> [18] Джо ©   (29.09.06 19:11)
> Неужели сложно пройтись отладчиком пошагово и установить
> точно, в какой именно строке вылезает AV?

Не прочитал предыдущий пост. Тогда скажу так: на какой именно строке возникает исключение?


 
_Guest_   (2006-09-29 19:15) [20]


> Джо ©   (29.09.06 19:12) [19]
>
> > [18] Джо ©   (29.09.06 19:11)
> > Неужели сложно пройтись отладчиком пошагово и установить
>
> > точно, в какой именно строке вылезает AV?
>
> Не прочитал предыдущий пост. Тогда скажу так: на какой именно
> строке возникает исключение?

В отладчике в пошаговом режиме исключения не возникает. Но методом муторных (F8... затем F9) проб установлено: на Handle := LoadLibrary("odbfinfo.dll");


 
Palladin ©   (2006-09-29 19:16) [21]

хм... сомневаюсь конечно, но может у тебя функция есть одноименная...


 
_Guest_   (2006-09-29 19:19) [22]


> Palladin ©   (29.09.06 19:16) [21]
>
> хм... сомневаюсь конечно, но может у тебя функция есть одноименная.
> ..

C   LoadLibrary ? Нет нету.


 
Джо ©   (2006-09-29 19:22) [23]

А если любую другую библиотеку попробовать грузить?


 
Palladin ©   (2006-09-29 19:22) [24]

odbfinfo.dll чья? тобой написана? в инициализации dll ничего нет криминального?

ps. веди текстовый трейсер...


 
_Guest_   (2006-09-29 19:23) [25]


> Джо ©   (29.09.06 19:22) [23]
>
> А если любую другую библиотеку попробовать грузить?

Попробую, но теперь уже в понедельник. Спасибо. Пока.


 
Rat Rat   (2006-09-29 19:41) [26]

Пара замечаний.

Неполенься сделать:

что-то вроде ExtractFilePath(Application.ExeName) + "моя.длл"

А то реально глаза косят от LoadLibrary("odbfinfo.dll");

По поводу использования PChar у тебя, парень ОХЕННЫЕ проблемы.
Я тебе обещаю еще и не те чудеса. На самом деле в дельфях есть очень простая щтючка PChar(my_string) - если она не пустая, то сработает. Об этом клоуны С. Тейксейра и К. Пачеко цельную главу написали. К вопросу о том, что не нужно мутить свой PChar.

Да. Мужики тоже дали очень дельную мысль по-поводу кода Длл-ки. Там тоже можно начудить.

Так что уж запости коды и длл (строк 10) и Form1.pas (без описания класса формы, плиз - только раздел implementation). Не поленимся, пособим.» Palladin:» Так. Маленькая просьба: речь желательно через фильтр и конвертор в удобоваримую форму. Истину глаголешь, но некультурно.


 
_Guest_   (2006-10-02 09:57) [27]

Мужики (и дамы если были), огромное всем спасибо! Много дельных замечаний, особенно по PChar. Обязательно учту. Особенно порадовало и обнадежило:

> Rat Rat   (29.09.06 19:41) [26]
> Не поленимся, пособим.


Извиняюсь, конечно, но ситуация такова: прихожу в понедельник на работу, гружу проект, даже не перекомпилируя, запускаю - все работает. Повторяю на всякий случай, компилирую, опять же - снова все работает. С чем был связан глюк непонятно. Может даже и не с Делфями. Я никогда бы не полез с такой фигней сюда, но глюк устойчиво держался с середины среды. Обязательно перелопачу близлежащий код на предмет всяких несуразностей типа как с PChar.
Еще раз ВСЕМ спасибо.


 
Ketmar ©   (2006-10-02 13:29) [28]

>[27] _Guest_ 2-Oct-2006, 09:57
бывает. но то, что оно заработало, ещё не значит, что бага не было. %-)


 
TStas ©   (2006-10-02 17:11) [29]

Вообще-то THandle Cardinal"ом всю жисть был, как Ришелье, например. Ну, или LongWord


 
Leonid Troyanovsky ©   (2006-10-02 18:48) [30]


> Rat Rat   (29.09.06 19:41) [26]


Одно замечание. Анонимные советы никчемны.
Или ничтожны (выбрать по вкусу).

--
Regards, LVT.


 
jack128 ©   (2006-10-02 23:25) [31]

Rat Rat   (29.09.06 19:41) [26]
что-то вроде ExtractFilePath(Application.ExeName) + "моя.длл"

А то реально глаза косят от LoadLibrary("odbfinfo.dll");

а чем плох LoadLibrary("моя.dll") , если не секрет ??


 
_Guest_   (2006-10-03 09:10) [32]


> Ketmar ©   (02.10.06 13:29) [28]
> бывает. но то, что оно заработало, ещё не значит, что бага
> не было. %-)

Конечно, поэтому и лопачу близлежащий код. Весь в ближайшее время не получится, там под сотню тысяч строк :(

> TStas ©   (02.10.06 17:11) [29]
> Вообще-то THandle Cardinal"ом всю жисть был, как Ришелье,
>  например. Ну, или LongWord

Ага, см. [8] и [11]



Страницы: 1 вся ветка

Текущий архив: 2006.11.12;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.056 c
2-1161930250
ГореПрограммер
2006-10-27 10:24
2006.11.12
Размер файла


2-1162098487
КлЯкСа
2006-10-29 08:08
2006.11.12
Ошибки при создании собственного проекта


15-1161216641
Real
2006-10-19 04:10
2006.11.12
MIDI.RU - База композиций теперь только для "избранных"


8-1144416142
NightLord
2006-04-07 17:22
2006.11.12
TGA and GLScene


15-1161552124
RASkov
2006-10-23 01:22
2006.11.12
Посмотрите