Форум: "Основная";
Текущий архив: 2006.11.12;
Скачать: [xml.tar.bz2];
Вниззагрузка 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;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.047 c