Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.09.05;
Скачать: [xml.tar.bz2];

Вниз

Получение из стэка Vsriant-указатель...   Найти похожие ветки 

 
Yaro   (2002-08-22 06:07) [0]

Собственно сабж... но с некоторыми уточнениями...

function VarFunc: Variant;
begin
<...>
Result := <...>;
end;

procedure TForm1.Button1.Click(Sender: TObject);
begin
asm
call VarFunc
end;
<????>
end;

где <????>, собственно и есть код получения результата выполнения функции...

помогите, плиз...

(с интеджером - все понятно, он в EAX заносится, а с вариантом как?)

(код должен быть на АСМе)

заранее спасибо!


 
Opuhshii   (2002-08-22 06:49) [1]

The following conventions are used for returning function result values.

Ordinal results are returned in a CPU register. Bytes are returned in AL, words are returned in AX, and double-words are returned in EAX.
Real results are returned in the floating-point coprocessor’s top-of-stack register (ST(0)). For function results of type Currency, the value in ST(0) is scaled by 10000. For example, the Currency value 1.234 is returned in ST(0) as 12340.
For a string, dynamic array, method pointer, or Variant result, the effects are the same as if the function result were declared as an additional var parameter following the declared parameters. In other words, the caller passes an additional 32-bit pointer that points to a variable in which to return the function result.

Pointer, class, class-reference, and procedure-pointer results are returned in EAX.
For static-array, record, and set results, if the value occupies one byte it is returned in AL; if the value occupies two bytes it is returned in AX; and if the value occupies four bytes it is returned in EAX. Otherwise, the result is returned in an additional var parameter that is passed to the function after the declared parameters.


 
Opuhshii   (2002-08-22 07:12) [2]

function VarFunc:Variant;
begin
Result:=666;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
P:Pointer;
L:^Variant;
MyVar:Variant;
begin
MyVar:=999;
p:=@VarFunc;
asm
call P
mov L,EAX
end;
Showmessage(L^);
end;


 
Yaro   (2002-08-23 03:25) [3]

Спасибо, вы очень мне помогли!
Но есть еще один вопрос - Если не известен тип возвращаемого значения функции, но есть указатель на саму функцию (без параметров), как быть в этом случае?


 
Opuhshii   (2002-08-23 11:47) [4]

мда,.. %),..
итак имея то что функция формальных параметров не имеет, имеем,. либо возвращаемый результат будет в EAX, либо в ST(0), либо в EAX и EDX (Int64),.. так что можно сразу сказать что результат либо Ordered, либо Real type (если на вершине стека FPU что-то есть,..),..
опять же,.
Ordered может быть указателем, если он больше либо равен ImageBase то сие может быть указателем на какую-либо процедуру-функцию(особенно если первый байт по этому адресу = $55 (push ebp)),.
на структуру, а уж на какую,.. если на класс, то по этому адресу мы имеем VMT этого класса,.. => по адресу -76 будет он же,.. а по адресу-44 ShortName этого класса,...
если это динамический массив, то по этому адресу-4 будет лежать колличество этих элементов,. а уж какой они длинны эти элементы,.. для Ansi-строки например размер элемента 1 байт, для Юникода 2 байта,.. у массива из Integer соответственно размер элемента 4 байта, а может это указатель на другую структуру или EntryPoint процедуры/функции,.. Wide string имеет по адресу -4 свою длинну в байтах,.. и в длинне(элементе номер длинна) терминальный нуль,.. и.тд,..

от себя лично: по-моему это полнейший бред! пытаться определить какой тип возвращает функция по этому значению,.. лучще смотреть что делает функция,.. вероятность определения типа возвращаемых данных больше,..

да, возможно я где-то неправ,.. поправьте если что,.. %)


 
Yaro   (2002-08-23 13:54) [5]

Может быть вконце самой функции что-то запихнуть в стэк? ORIGINAL, например, который содержит значение функции VarType, которое получается, снова-таки в конце функции, а потом определять что это такое. Как вы думаете?
Но снова-таки... Тогда мне надо знать что и куда пихается, если такой-то тип...


 
Yaro   (2002-08-23 14:00) [6]

И еще одно... Как написать ActiveX компонент? Вот у меня есть класс, например потомок от TWinControl, как мне из него ActiveX сделать? Все мои попвтки оказалить тщетными... :( Там такой фигни понапихано, что и не понятно что к чему...


 
Opuhshii   (2002-08-23 14:38) [7]

2Yaro © (23.08.02 13:54)
дык эта ваша функция? которая определенно возвращает Variant,. чего ж вы голову греете,.. %)

function VarFunc:Variant;
begin
Result:=666;
end;

procedure TForm1.ButtonX1Click(Sender: TObject);
var
P:Pointer;
L:^Variant;
MyVar:Variant;

begin
MyVar:=999;
p:=@VarFunc;
asm
call P
mov L,EAX
end;
MyVar:=L^;
if VarType(MyVar) = varInteger then
Showmessage(VarASType(MyVar,varString) + " is Integer!!!" );
end;


2Yaro © (23.08.02 14:00)
проще пареной репы,.. imho,.. берте свой класс,. тот что потомок от TWinControl описываете,.. и инсталируете(procedure Register; begin RegisterCOmponent("MyComponent",[TMyComponent]),
end;)
вообщем обычный компанент,.. %)...
а вот теперь,... File-New-ActiveX-ActiveXControl,
VCLClassName - TMyComponent, нажимаем OK, соглашаемся что нужна ActiveXLibrary, теперь RUN-RegisterActiveXServer.. Все,. ты его имеешь,..

ЗЫ: "...загибаем пальцы и делаем умное лицо..."(с) не мое, тут в статьях прочитал,...


 
Yaro   (2002-08-23 21:20) [8]

Это я тоже сам разобрался, а теперь следующий вопрос - как использовать *.OCX файлы в своей программе динамически ? Как при работе с LoadLibrary & *.dll?


 
kig   (2002-08-23 22:55) [9]

2 Yaro © (23.08.02 21:20)

>как использовать *.OCX файлы в своей программе динамически?

Смотри использование TOleContainer



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

Форум: "Основная";
Текущий архив: 2002.09.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.008 c
3-13955
atmospheric
2002-08-15 02:19
2002.09.05
номер строки столбца ?


3-13941
atmospheric
2002-08-15 22:43
2002.09.05
Переташить прогу на другой комп ?


1-14137
race1
2002-08-23 13:06
2002.09.05
кнопка


1-14047
Wild Sam
2002-08-22 18:53
2002.09.05
Друзья! При вызове метода Open TExcelApplication.Workbooks вы-


14-14246
Malder
2002-08-07 00:22
2002.09.05
UBPFD





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский