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

Вниз

DLL. Передача   Найти похожие ветки 

 
Skier ©   (2003-06-16 11:09) [0]

Господа, столкнулся с проблемой...
Попробую живописать её в кратце :)

Пишу интерпретатор, в нём есть возможность вызова функций(процедур) из DLL с использованием любых соглашений кроме
safecall и использованием "составных" параметров (записей и массивов), так вот (чтобы было наглядней) рассмотрим такие варианты вызова функции.

{$A+} //если кому интересно...:)

type
TByteArray = array[0..3] of Byte;
TBloodyByteArray = array[0..2] of Byte;

//.....................
var
A : TByteArray;
B : TBloodyByteArray;
C : Integer;
D : Integer;
begin
A[0] := 10;
A[1] := 20;
A[2] := 30;
A[3] := 40;
//...........
B[0] := 10;
B[1] := 20;
B[2] := 30;
//...........
C := TestFuncFromDLL(A);
D := BloodyTestFuncFromDLL(B);
end;
//.....................


//-----------------
//DLL
//-----------------

тоже {$A+} //если кому интересно...:)

код функций в dll самый простой (ибо это тест)

type
TByteArray = array[0..3] of Byte;
TBloodyByteArray = array[0..2] of Byte;


function TestFuncFromDLL(A : TByteArray) : Integer;
begin
Result := 1;
ShowMessage(IntToStr(A[0]));
ShowMessage(IntToStr(A[1]));
ShowMessage(IntToStr(A[2]));
ShowMessage(IntToStr(A[3]));
end;


function BloodyTestFuncFromDLL(B : TBloodyByteArray) : Integer;
begin
Result := 2;
ShowMessage(IntToStr(B[0]));
ShowMessage(IntToStr(B[1]));
ShowMessage(IntToStr(B[2]));
end;


//............

Используеьтся register и там и там... ВСЁ ЭТО ПРОВЕРЕНО !

Штука в том что TestFuncFromDLL выводит (ShowMessage(...))
всё правильно, а вот BloodyTestFuncFromDLL выводит какой-то
бред ! Но при этом exception-ов никаких не генерит.

Я пробовал передавать в регистре EAX и указатель на структуру
TBloodyByteArray (со значениями 10, 20, 30) и значения структуры
TBloodyByteArray (со значениями 10, 20, 30) , но не результат
один и тот же - бред !

Что интересно, в хелпе про 3 байтные параметры не сказано ничего

Цитирую :

Sets, records, and static arrays of 1, 2, or 4 bytes are passed as 8-bit, 16-bit, and 32-bit values. Larger sets, records, and static arrays are passed as 32-bit pointers to the value. An exception to this rule is that records are always passed directly on the stack under the cdecl, stdcall, and safecall conventions; the size of a record passed this way is rounded upward to the nearest double-word boundary.

Про 3 байта молчок.

Может я что-то не так а) делаю б) понял ?
Или может есть какие-то хитрости в случае 3 байт ?

HELP !!!


 
Digitman ©   (2003-06-16 12:09) [1]

в этом конкретном случае параметр B передается через стек и содержит двойное слово, мл. 3 байта которого имеют значения элементов b[0], b[1], b[2]

баланс стека после возврата из п/п осуществляет вызывающий код


 
Skier ©   (2003-06-16 12:15) [2]

>Digitman © (16.06.03 12:09)
Большое спасибо ! Попробую !


> в этом конкретном случае параметр B передается через стек

А это из личного опыта или есть какая-то дока по этому поводу ?
Если это дока, то нельзя ли URL-ом поделиться ? :)


 
Digitman ©   (2003-06-16 12:24) [3]


> Skier


Все гораздо прозаичней - простая трассировка кода в окне CPU.

Пять минут позора - и ответ на вопрос готов)


 
Skier ©   (2003-06-16 12:31) [4]

>Digitman © (16.06.03 12:24)
Хм. А я-то трассировал в полной уверенности, что всё
происходит через EAX; голова была сориентированна в сторону
энтого злобного регистра. :)
Вообще странно что по 3 байта ничего не написано...


 
Digitman ©   (2003-06-16 12:38) [5]


> я-то трассировал в полной уверенности, что всё
> происходит через EAX


Как же ты так трассировал, не видя при этом реалий происходящего - непонятно)

Сразу же видно

push ... // в стек - содержимое eax
call ...
pop ... // баланс стека


 
Skier ©   (2003-06-16 12:43) [6]

>Digitman © (16.06.03 12:38)

> Как же ты так трассировал, не видя при этом реалий происходящего
>

Плохо трассировал. Дело было поздно вечером...:))


 
Digitman ©   (2003-06-16 12:54) [7]


> Skier


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


 
Skier ©   (2003-06-16 12:59) [8]

>Digitman © (16.06.03 12:54)
А вот это уже совсем интересно !
Спасибо за ликбез !
Будем копать дальше...
Да, чуть не забыл, трассировать вечером, мне видимо, не стОит. :)


 
Skier ©   (2003-06-16 13:05) [9]

>Digitman © (16.06.03 12:54)
Проблема ещё и в том что в ассемблере я не слишком силён,
в процессе написания интерпретатора это и выплыло, но хорошо
что есть более опытные товарищи, которые ненавязчиво укажут
на ошибку и на твоё место... :)))
Ещё раз спасибо ! Буду пробовать с учётом твоих замечаний...


 
Digitman ©   (2003-06-16 13:13) [10]


> Skier


1 : 1

)


 
Skier ©   (2003-06-23 09:07) [11]

Сергей, всё получилось !
Спасибо тебе большущее !


 
Digitman ©   (2003-06-23 09:11) [12]

Успехов тебе, Анатолий !



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

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

Наверх




Память: 0.5 MB
Время: 0.025 c
14-7725
Knight
2003-06-16 21:57
2003.07.03
ПОРЯДОК... ПРОГРЕСС...


1-7492
Ajax
2003-06-18 21:03
2003.07.03
Утечки памяти.


6-7590
Алексей Глеб
2003-04-26 17:15
2003.07.03
Server & Delphi


3-7347
Sedunov Vitaly
2003-06-10 13:54
2003.07.03
ClientDataSet.Locate


14-7715
UserName
2003-06-15 00:52
2003.07.03
Подскажите плиз