Так, если вы собираетесь делать какие-то действия с любым типом OLE-сервера, то для этого вам необходимо будет использовать все нудные и противные рутинки из набора Windows SDK. Но будет лучше, если всем этим будет заправлять специализированный компонент. Но этот вопрос уже не к Borland.
OLE сервер
Delphi 1
Следующий код компилируется без проблем. Он не так ясен и понятен, но он может вам помочь:
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.
На моем компьютере это компилируется без проблем. Должно работать и у вас. Предупреждение. Обращение к методам должно быть немного другим, нежели к функциям.
Как я могу избавиться от 'зарегистрированного' имени сервера, если я не хочу использовать его далее?
Nomadic советует:
Запустите исполняемый файл сервера с ключом /UNREGSERVER:
MYSERVER.EXE /UNREGSERVER
Это обычный путь разрегистрации саморегистрирующегося сервера автоматизации OLE.
Миграция
Delphi 2
Совместимость D1/D2
Какая может быть причина того, что программа, работающая в среде W31, не работает в W95 ?
Похоже на то, что данные, сохраненные в двоичном файле, читаются неправильно.
Имеется масса отличий в фундаментальных типах между Delphi 1.0 и Delphi 2.0, которые могут повлиять на двоичный файл. Вот некоторые из них:
1. строки в Delphi 1.0 не эквивалентны строкам по умолчанию (длинным) в версии 2.0
2. «integer» 16-битный в Delphi 1.0 и 32-битный в 2.0
3. записи автоматически упаковываются в Delphi 1.0, но не в Delphi 2.0
– Rick Rogers
Delphi 3
Куда из Delphi 3 делся модуль для работы с ReportSmith? А мои любимые модули работы с OLE: ole2, oleauto и olectl?
Одной строкой
Nomadic отвечает:
Они лежат в X:\DELPHI3\LIB\DELPHI2.
Ошибки
Delphi 1
Ошибка маски редактирования на быстрых пентиумах
Delphi 1
Данное поведение уже упоминалось ранее. Это, похоже, происходит только на быстрых машинах. Если у вас имеется исходный код RTL, вы можете сделать следующие изменения:
В MASK.PAS, замените
for I := Low(NewKeyState) to High(NewKeyState) do NewKeyState[I] := 0;
На
NewKeyState := KeyState;
– Steve Schafer
PASDBK16.DLL вызывает GPF
Delphi 1