Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.079 c
15-1161603283
Курдль
2006-10-23 15:34
2006.11.12
Прошу поделиться опытом в Web-проектировании.


2-1161775849
KyRo
2006-10-25 15:30
2006.11.12
Код Enter


1-1159785290
Still Swamp
2006-10-02 14:34
2006.11.12
Возможно ли отпечатать через TPrinter обычную строку?


15-1161522130
PHPDeveloper
2006-10-22 17:02
2006.11.12
Кто сколько часов спит в день


15-1161574022
Slider007
2006-10-23 07:27
2006.11.12
С днем рождения ! 23 октября





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский