Глюки при вызове DLL на С
От: KoanMu  
Дата: 04.08.05 14:14
Оценка:
Язык С:
В DLL объявлена функция:
__declspec( dllexport ) long MidiReadBytes(MIDIFILE * mf, unsigned char * buf, unsigned long count);


Язык DELPHI:

Type
PByte = ^Byte;
pMIDIFILE = ^MIDIFILE;
MIDIFILE = record
{
.... структура аналогичная структуре в С
}
end;

TMidiReadBytes = function (mf:pMIDIFILE; buf:PByte; count:Longword):Longint;cdecl;

function MyFunc(mf:pMIDIFILE);
var
i:Word;
chr: Array [0..59] of Byte;
MidiReadBytes:TMidiReadBytes;
begin
{
здесь получаем DllHandle
}

@MidiReadBytes := GetProcAddress(DllHandle,PChar('MidiReadBytes'));
i:=0;
result := MidiReadBytes(mf, @chr[i], 1);
{
!!!! после вызова функции MidiReadBytes изменилась "i"
}
end;


Что я сделал не так?
Думал, что это произошло из-за неправильного объявления вызываемой функции, но тогда бы при ее вызове происходила ошибка.
Но она не происходит.
Re: Глюки при вызове DLL на С
От: Oleg A. Bachin Украина  
Дата: 05.08.05 07:17
Оценка:
Здравствуйте, KoanMu, Вы писали:

KM>Язык С:

KM>В DLL объявлена функция:
KM>__declspec( dllexport ) long MidiReadBytes(MIDIFILE * mf, unsigned char * buf, unsigned long count);


KM>Язык DELPHI:


KM>Type

KM>PByte = ^Byte;
KM>pMIDIFILE = ^MIDIFILE;
обрати внимание
KM>MIDIFILE = packed record
KM>{
KM>.... структура аналогичная структуре в С
KM>}
KM> end;

KM>TMidiReadBytes = function (mf:pMIDIFILE; buf:PByte; count:Longword):Longint;cdecl;


KM>function MyFunc(mf:pMIDIFILE);

KM>var
KM>i:Word;
KM>chr: Array [0..59] of Byte;
KM>MidiReadBytes:TMidiReadBytes;
KM>begin
KM>{
KM>здесь получаем DllHandle
KM>}

KM>@MidiReadBytes := GetProcAddress(DllHandle,PChar('MidiReadBytes'));

KM>i:=0;
KM>result := MidiReadBytes(mf, @chr[i], 1);
KM>{
KM>!!!! после вызова функции MidiReadBytes изменилась "i"
KM>}
KM>end;

а с чего ты взял что переменная изменилась? под отладчиком смотришь? так она у тебя больше не используется и оптимизатор ее уже выкинул давно, если просто сразу не подставил @chr[0].

KM>Что я сделал не так?

KM>Думал, что это произошло из-за неправильного объявления вызываемой функции, но тогда бы при ее вызове происходила ошибка.
KM>Но она не происходит.

то что все не посыпалось еще не означает что все правильно
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Best regards,
Oleg A. Bachin
Re[2]: Глюки при вызове DLL на С
От: KoanMu  
Дата: 05.08.05 16:32
Оценка:
Здравствуйте, Oleg A. Bachin, Вы писали:

OAB>обрати внимание

KM>>MIDIFILE = packed record
KM>>{
KM>>.... структура аналогичная структуре в С
KM>>}
KM>> end;
так тоже пробовал, увы не помогло.

OAB>а с чего ты взял что переменная изменилась? под отладчиком смотришь? так она у тебя больше не используется и оптимизатор ее уже выкинул давно, если просто сразу не подставил @chr[0].


Да смотрю под отладчиком. Но если бы ее оптимизатор выкинул, то в отладчике эта переменная была бы вообще недоступна.
Кстате, пробовал её вывести на экран для достоверности.

OAB>то что все не посыпалось еще не означает что все правильно

Библиотека загружалась правильно, т.к. вызывал другие ее функции (правда они имели в один аргумент и тоже pMIDIFILE) и они работали нормально.
Кстате не может ли так оказаться, что вызываемая функция каким то образом перекрывает память по переменной "i" и тем самым ее затирает?
Если это так, то может от того что как то не так согласованы переменные на ее входе?
Re: Глюки при вызове DLL на С
От: Аноним  
Дата: 05.08.05 16:54
Оценка:
Здравствуйте, KoanMu, Вы писали:

KM>Язык С:

KM>В DLL объявлена функция:
KM>__declspec( dllexport ) long MidiReadBytes(MIDIFILE * mf, unsigned char * buf, unsigned long count);


KM>Язык DELPHI:


KM>TMidiReadBytes = function (mf:pMIDIFILE; buf:PByte; count:Longword):Longint;cdecl;


Я бы
1) переделал соглашение о вызовах на stdcall
2) cравнил выравнивания для полей структур, которые используются в C и Delphi

Где-то идет перехлест за пределы памяти, отведенной переменным для работы с Dll
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.