Форум: "Основная";
Текущий архив: 2003.07.03;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.009 c