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

Вниз

Робота с DLL   Найти похожие ветки 

 
stepan_mk ©   (2004-01-30 15:43) [0]

после вихода из процедури которая загружала 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 16:15) [1]


> SHAREMEM


осознанно указан ? и в хост-проекте тоже ?

а вот этот код требует твоего пояснения :

  while not res do
   begin
   end;
   while FreeLibrary(H) do;

хоть убей не пойму , зачем здесь эти циклы


 
stepan_mk ©   (2004-01-30 16:29) [2]

SHAREMEM Есть и в основном модуле программи
while not res do
  begin
  end;

Согласен ето лишнее
while FreeLibrary(H) do;
Так рекомендовали в книге делать, что б бить увереним что dll вигрузилась. Тоесть вигружать до тех пор пока не будет вигружена


 
Digitman ©   (2004-01-30 16:47) [3]


> SHAREMEM Есть и в основном модуле программи


а чем это оправдано ?
из приведенного кода это неочевидно


> Так рекомендовали в книге делать, что б бить увереним что
> dll вигрузилась. Тоесть вигружать до тех пор пока не будет
> вигружена


чушь там написали.

ну да к делу это не относится.

Access violation at address ...

что реально видишь вместо троеточия ? это важно !


 
stepan_mk ©   (2004-01-30 16:54) [4]

Сейчас убрал из 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:59) [5]

я так и не понял, зачем ты sharemem туда-сюда гоняешь ..
он там зачем вообще изначально был ? можешь вразумительно ответить ?

и еще ...
а ты соглашение о вызове соблюл хоть ?


 
Digitman ©   (2004-01-30 17:01) [6]


> чушь там написали.


уточню - именно для стат.загрузки это действительно чушь


 
stepan_mk ©   (2004-01-30 17:07) [7]

SHAREMEM, в той же книге рекомендовали включать и в Длл и в модуле, причем sharemem должна била стоять первая в списке. Включать как будто для того чтоб со строками нормально работало.
Что значит соблюл ли я соглашение о визове?
Наверное ето
showschema: Function (var Orasession:TOrasession):boolean; stdcall;
Я уже кстати переделал через процедуру В Dll переписал showschema как процедуру и так же в модуле но ошибка та же.


 
Digitman ©   (2004-01-30 17:12) [8]


> Включать как будто для того чтоб со строками нормально работало


ну ты хоть вник бы, о каких конкретно ситуациях работы со строками речь там идет)

вот декларация твоей ф-ции в DLL :

function Showschema(var Orasession:TOrasession):boolean;

а вот - в хост-приложении :

showschema: Function (var Orasession:TOrasession):boolean; stdcall;

разница есть, как думаешь ?


 
stepan_mk ©   (2004-01-30 17:17) [9]

Речь идет о длинних стороках.
function Showschema(var Orasession:TOrasession):boolean;
showschema: Function (var Orasession:TOrasession):boolean; stdcall;
Разници, честно говоря, не вижу


 
Digitman ©   (2004-01-30 17:21) [10]


> Разници, честно говоря, не вижу


ну как же ? а stdcall ? я ж специально жирным выделил !
это и есть соглашение о вызове ! и оно должно быть одинаковым для вызывающего и вызываемого кода !


 
stepan_mk ©   (2004-01-30 17:24) [11]

понял шас попробую


 
stepan_mk ©   (2004-01-30 17:26) [12]

Супер!
Добавил stdcall в dll и все заработало.
Спасибо.


 
Digitman ©   (2004-01-30 17:30) [13]


> stepan_mk ©   (30.01.04 17:26) [12]


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



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

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

Наверх




Память: 0.5 MB
Время: 0.034 c
3-1078232067
Rule
2004-03-02 15:54
2004.04.04
Как сделать автоинкремент а TClientDataset ?


14-1078354077
Orik_Dreammy
2004-03-04 01:47
2004.04.04
Книгу надо...блин...ОЧЕНЬ!!!


6-1074888197
Evgen
2004-01-23 23:03
2004.04.04
CGI


3-1078931202
Vit
2004-03-10 18:06
2004.04.04
Как сделать все ячейки отчета одной высоты.


11-1058198809
Кладов
2003-07-14 20:06
2004.04.04
Тестирование программ