• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

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

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

проблемы с вызовом Dll- функции скомпилированной в делфи.

  • Автор темы eclipsevl
  • Дата начала
Статус
Закрыто для дальнейших ответов.
E

eclipsevl

вобщем проблема вот в чем:

в длл(исходник на делфи у меня есть) есть функция DoGetRS232Buffer

Код:
function DoGetRS232Buffer(var RS232Buffer:array of byte; var RS232BufferLength:integer):integer; stdcall export;
//;get received bytes from FIFO RS232 buffer
var
BufferLength,i:integer;
RS232BufferWriteLocal:integer;
P:^integer;
begin
BufferLength:=0;
Result:=NO_ERROR;
if RS232BufferLength>0 then
for i:=1 to RS232BufferLength do
begin
P:=@PGlobalRS232Buffer^[GlobalRS232BufferWritePos];
RS232BufferWriteLocal:=P^;
if (RS232BufferRead=RS232BufferWriteLocal) then
Break;
RS232Buffer[BufferLength]:=PGlobalRS232Buffer^[RS232BufferRead];
inc(BufferLength);
RS232BufferRead:=(RS232BufferRead+1) mod (GlobalRS232BufferEnd+1);
end;
RS232BufferLength:=BufferLength;
end;

как я понял, для ее вызова нужен массив типа byte(возвращаемый этой функцией) и размер массива типа int. при написании программы на c++ я заменил byte на char. вот код вызова функции

Код:
	typedef int(WINAPI *DoGetRS232Buffer)(char *,int);
DoGetRS232Buffer	GetBuff;
hUSBdll=LoadLibrary(DllName)
GetBuff=(DoGetRS232Buffer)::GetProcAddress(hUSBdll,"DoGetRS232Buffer")

затем вызываю ее

Код:
	char ch[90];
a = sizeof(ch);
GetBuff(ch,a);


но функция ничего не возвращает и после закрытия программы появляется окно ошибки.
может я что-то сделал не так ?
P.S. остальные функции этой dll работают просто отлично.
 

Kmet

Well-known member
25.05.2006
904
8
BIT
0
босью что косяк в том, что одним из входным парметров является динамический массив, который явялется более сложной структорой данных чем просто указатель, хотя я могу ошибаться
 
E

eclipsevl

к сожалению, это так. а есть ли какойто выход из этого положения ? на делфи народ как-то делает такую вещь...
 
E

eclipsevl

пробывал...

если массив не динамический
Код:
char ch[10];

толку от функции нет, а прога после закрытия выдает ошибку...

если динамический
Код:
char *ch;

то прямо после запуска ошибка...
 
Z

zubr

Я как то делал такую штуку, только наоборот - из проги на Delphi передавал данные в Dll на VS C++. Так вот данные из Delphi передавались в виде динамического массива - все корректно работало. Надо будет поковыряться в архивах.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!