Следующий код компилируется без проблем. Он не так ясен и понятен, но он
может вам помочь:
unit Unit1;
interfacefunction OLEfunction(x, y, z: integer): integer; cdecl; export;
implementationfunction OLEfunction(x, y, z: integer): integer;
beginend;
procedure buildOLEstructure;
var
F: pointer;
begin
F := @OLEfunction; { Компилируется без проблем ... }end;
end.
Используйте метод, приведенный ниже. Вы должны объявить одну вызывающую
функцию к каждой комбинации параметров, которые вы собираетесь передавать. Затем
вы вызываете вызывающую функцию (сорри) и передаете ей как указатель функцию,
которую вы хотите вызвать (еще раз сорри). Непонятно? Поясню на примере:
library Pcdecl;
function olefunction(a1 : pchar; a2 : longint; x : integer ) : integer;
cdecl; export;
beginend;
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.
На моем компьютере это компилируется без проблем. Должно работать и у вас.
Предупреждение. Обращение к методам должно быть немного другим, нежели к
функциям.
Сервер OLE сервер - инструмент для создания интерфейса между программами, позволяющий вызывать функции других приложений из собственного кода.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS