Советы по Delphi

         

OLE сервер


Следующий код компилируется без проблем. Он не так ясен и понятен, но он может вам помочь:

    unit Unit1;
interface function OLEfunction(x, y, z: integer): integer; cdecl; export; implementation

function
OLEfunction(x, y, z: integer): integer; begin end;


procedure buildOLEstructure; var F: pointer; begin F := @OLEfunction; { Компилируется без проблем ... } end;

end.

Используйте метод, приведенный ниже. Вы должны объявить одну вызывающую функцию к каждой комбинации параметров, которые вы собираетесь передавать. Затем вы вызываете вызывающую функцию (сорри) и передаете ей как указатель функцию, которую вы хотите вызвать (еще раз сорри). Непонятно? Поясню на примере:

    library Pcdecl;

function olefunction(a1 : pchar; a2 : longint; x : integer )  : integer;
cdecl; export; begin
end
;
function callolefunction(func : pointer; a1 : pchar; a2 : longint; x :
integer)  : integer;
assembler; asm
push        x             { помещаем параметры в обратном порядке } push        word ptr a2 + 2     { если 32-битная величина передается в этих двух шагах, то начинаем с самой "высокой" (high) части } push        word ptr a2 push        word ptr a1 + 2 push        word ptr a1 call        func add        sp, 10                    { восстанавливаем стек добавлением вытолкнутых байтов. Обратите внимание на то, что func не была вытолкнута } end;
procedure buildolefunction;
var
f         : pointer; reslt     : integer; begin
f := @olefunction; { --- } reslt := callolefunction(f, 'Здравствуй, мир', 1000000, 25); { --- } end;
begin
{ --- } end.

На моем компьютере это компилируется без проблем. Должно работать и у вас. Предупреждение. Обращение к методам должно быть немного другим, нежели к функциям. [001430]



Содержание раздела