dll на C и Delphi, Ошибка при выходе.
От: morden Украина http://www.morden.com.ua/
Дата: 15.04.05 21:29
Оценка:
Помогите чем можите. Просмотрел весь форум по поводу ошибок в Делфи при вызове длл на Си, но к сожалению ничего путёвого не нашол.

На Си пишу dll:


#define EXPORT extern "C" __declspec (dllexport)
EXPORT void myDllFunc(int s)
{
...
}



когда вызываю из делфи:


procedure TForm1.Button1Click(Sender: TObject);
var
    dllFunc:procedure(a:integer); stdcall;
begin
    if hDll<>0 then
    begin
        @dllFunc:=GetProcAddress(hDll,'myDllFunc');
        if Assigned(@dllFunc)=false then
            ShowMessage('Функция не найдена!')
        else
            dllFunc(2);
    end;
    ShowMessage('конец блока!')
    //до этого момента - всё нормльно.
end;



работает всё нормально, но при окончании блока, тобишь выходе из функции

Button1Click, выдаёт сообщение:


Project D:\... faulted with message: 'access volation
as 0x012074ed: read of adress 0x00000001'. Process Stopped. Use Step or Run to contioue



Затем выводит окно с ассемблерным кодом. Причём если параметры отсутствуют

в функции, всё работает нормально. Пробовал разные типы даннх, разные варианты, всё нормально работает только до выхода из блока.

Длл объявляется при создании формы и освобождается при её разрушении:

    hDll:=LoadLibrary('mydll.dll');


и

    FreeLibrary(hDll);


соотв.


Может делфи резервирует где-то переменные при запуске функции, а затем пытается повторно их удалить при окончании обработчика события? Или надо как-то функции освобождать? Всегда работал с длл, проблем никаких навызывало, пока не столкнулся с Делфи
Re: dll на C и Delphi, Ошибка при выходе.
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 15.04.05 22:04
Оценка: +1
Здравствуйте, morden, Вы писали:

M>Помогите чем можите. Просмотрел весь форум по поводу ошибок в Делфи при вызове длл на Си, но к сожалению ничего путёвого не нашол.


M>На Си пишу dll:


M>
M>#define EXPORT extern "C" __declspec (dllexport)
M>EXPORT void __stdcall myDllFunc(int s)
M>{
M>...
M>}
M>


Добавление выделено жирным. Внимательнее надо быть — в Delphi вы прототип объявили как stdcall, в в C++ DLL функция с прототипом __cdecl (по умолчанию). Calling convention не соблюдено, отсюда и глюки.
Удобный способ просмотра балансов и курсов валют! Специальное предложение для exUSSR: http://www.showmestat.com/swrus.php
Re: dll на C и Delphi, Ошибка при выходе.
От: sergey82  
Дата: 16.04.05 08:28
Оценка:
Здравствуйте, morden, Вы писали:

M>Помогите чем можите. Просмотрел весь форум по поводу ошибок в Делфи при вызове длл на Си, но к сожалению ничего путёвого не нашол.


M> .....


M>Может делфи резервирует где-то переменные при запуске функции, а затем пытается повторно их удалить при окончании обработчика события? Или надо как-то функции освобождать? Всегда работал с длл, проблем никаких навызывало, пока не столкнулся с Делфи


Почти так оно и есть.

У тебя не сказано, кто будет чистить стек. В результате стек пытается чистить как вызываемая функция так и вызывающая.

Чтобы решить проблему, поставь в объявлении delphi-функции
... foo() ....; StdCall;


И в C функции аналогично:

... __stdcall foo();


Тогда стек будет чиститься правильно (вызываемой функцией, насколько я помню).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.