Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-7420
antoniz
2003-06-23 11:19
2003.07.03
Может, кто знает как связать книгу Excel с IPersistStream


14-7693
Карлсон
2003-06-14 14:22
2003.07.03
разводка печатной платы.


1-7460
clickmaker
2003-06-20 14:24
2003.07.03
record как out-параметр в методах IAppServer


3-7324
keymaster
2003-06-05 15:33
2003.07.03
Как работать с удалённой БД?


1-7413
McSimm2
2003-06-23 10:03
2003.07.03
Начало редактирования ячейки в StringGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский