Помогите чем можите. Просмотрел весь форум по поводу ошибок в Делфи при вызове длл на Си, но к сожалению ничего путёвого не нашол.
На Си пишу 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);
соотв.
Может делфи резервирует где-то переменные при запуске функции, а затем пытается повторно их удалить при окончании обработчика события? Или надо как-то функции освобождать? Всегда работал с длл, проблем никаких навызывало, пока не столкнулся с Делфи
Здравствуйте, 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 не соблюдено, отсюда и глюки.
Здравствуйте, morden, Вы писали:
M>Помогите чем можите. Просмотрел весь форум по поводу ошибок в Делфи при вызове длл на Си, но к сожалению ничего путёвого не нашол.
M> .....
M>Может делфи резервирует где-то переменные при запуске функции, а затем пытается повторно их удалить при окончании обработчика события? Или надо как-то функции освобождать? Всегда работал с длл, проблем никаких навызывало, пока не столкнулся с Делфи
Почти так оно и есть.
У тебя не сказано, кто будет чистить стек. В результате стек пытается чистить как вызываемая функция так и вызывающая.
Чтобы решить проблему, поставь в объявлении delphi-функции
... foo() ....; StdCall;
И в C функции аналогично:
... __stdcall foo();
Тогда стек будет чиститься правильно (вызываемой функцией, насколько я помню).