![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Робота с DLL [D7, WinXP]
stepan_mk © (2004-01-30 15:43:00)после вихода из процедури которая загружала dll ошиПка Access violation at address ... Write of address 00000000. Вот сорси
Dll
library schema;
uses
SHAREMEM,SysUtils, Classes, Ora, Dialogs;
{$R *.res}
function Showschema(var Orasession:TOrasession):boolean;
begin
Showmessage('Hi I''m DLL');
result:=true;
end;
exports
Showschema;
end.
Программа
procedure TMainForm.N21Click(Sender: TObject);
var res:boolean;
begin
H:=LoadLibrary('schema.dll');
if H<>0
then
begin
Showschema:=GetProcAddress(H,'Showschema');
res:=Showschema(Datamodule2.Orasession1);
while not res do
begin
end;
while FreeLibrary(H) do;
end;
end;
Showmessage отображается нормально. А вот ошипка даже не дает вийти из программи.
Что я опять не так делаю?
Когда коментирую вигрузку библиотеки то ошибка Privileged instruction
Digitman (2004-01-30 17:30:00) [1]
> stepan_mk © (30.01.04 17:26) [12]
а я бы наоборот и там и там убрал, если точно знаю, что иных потенциальных сред взаимодействия кроме Делфи не будет ... ни для хост-приложения ни для библ-ки
stepan_mk (2004-01-30 17:26:00) [2]Супер!
Добавил stdcall в dll и все заработало.
Спасибо.
stepan_mk (2004-01-30 17:24:00) [3]понял шас попробую
Digitman (2004-01-30 17:21:00) [4]
> Разници, честно говоря, не вижу
ну как же ? а stdcall? я ж специально жирным выделил !
это и есть соглашение о вызове ! и оно должно быть одинаковым для вызывающего и вызываемого кода !
stepan_mk (2004-01-30 17:17:00) [5]Речь идет о длинних стороках.
function Showschema(var Orasession:TOrasession):boolean;Разници, честно говоря, не вижу
showschema: Function (var Orasession:TOrasession):boolean; stdcall;
Digitman (2004-01-30 17:12:00) [6]
> Включать как будто для того чтоб со строками нормально работало
ну ты хоть вник бы, о каких конкретно ситуациях работы со строками речь там идет)
вот декларация твоей ф-ции в DLL :
function Showschema(var Orasession:TOrasession):boolean;
а вот - в хост-приложении :
showschema: Function (var Orasession:TOrasession):boolean; stdcall;
разница есть, как думаешь ?
stepan_mk (2004-01-30 17:07:00) [7]SHAREMEM, в той же книге рекомендовали включать и в Длл и в модуле, причем sharemem должна била стоять первая в списке. Включать как будто для того чтоб со строками нормально работало.
Что значит соблюл ли я соглашение о визове?
Наверное ето
showschema: Function (var Orasession:TOrasession):boolean; stdcall;
Я уже кстати переделал через процедуру В Dll переписал showschema как процедуру и так же в модуле но ошибка та же.
Digitman (2004-01-30 17:01:00) [8]
> чушь там написали.
уточню - именно для стат.загрузки это действительно чушь
Digitman (2004-01-30 16:59:00) [9]я так и не понял, зачем ты sharemem туда-сюда гоняешь ..
он там зачем вообще изначально был ? можешь вразумительно ответить ?
и еще ...
а ты соглашение о вызове соблюл хоть ?
stepan_mk (2004-01-30 16:54:00) [10]Сейчас убрал из dll sharemem, и тпереь постоянно после вихода их процки видает сообщение
Access violation at ADDRESS 00D64320. Read of address FFFFFFD6
Когда убираю sharemem и из приложения то
Access violation at ADDRESS 00CB4320. Read of address FFFFFFCB
Когда убираю sharemem и из приложения (dpr) а добавляю в unit
то Privileged instruction
Digitman (2004-01-30 16:47:00) [11]
> SHAREMEM Есть и в основном модуле программи
а чем это оправдано ?
из приведенного кода это неочевидно
> Так рекомендовали в книге делать, что б бить увереним что
> dll вигрузилась. Тоесть вигружать до тех пор пока не будет
> вигружена
чушь там написали.
ну да к делу это не относится.
Access violation at address ...
что реально видишь вместо троеточия ? это важно !
stepan_mk (2004-01-30 16:29:00) [12]
SHAREMEMЕсть и в основном модуле программи
while not res do
begin
end;
Согласен ето лишнее
while FreeLibrary(H) do;
Так рекомендовали в книге делать, что б бить увереним что dll вигрузилась. Тоесть вигружать до тех пор пока не будет вигружена
Digitman (2004-01-30 16:15:00) [13]
> SHAREMEM
осознанно указан ? и в хост-проекте тоже ?
а вот этот код требует твоего пояснения :
while not res do
begin
end;
while FreeLibrary(H) do;
хоть убей не пойму , зачем здесь эти циклы