Если я правильно понял ваш вопрос, то вы можете это сделать, вот один из способов:
testdll.dll
library TestDll;
uses
SysUtils,
Classes,
uCommon in 'uCommon.pas';
{$R *.res}
procedure TakeMyFancyRecord(AMyFancyRecord: PMyFancyRecord); stdcall;
begin
AMyFancyRecord^.DoSomething;
end;
exports
TakeMyFancyRecord name 'TakeMyFancyRecord';
begin
end.
uCommon.pas ‹- используется как приложением, так и dll, модулем, в котором определяется ваша необычная запись
unit uCommon;
interface
type
PMyFancyRecord = ^TMyFancyRecord;
TMyFancyRecord = record
Field1: Integer;
Field2: Double;
procedure DoSomething;
end;
implementation
uses
Dialogs;
{ TMyFancyRecord }
procedure TMyFancyRecord.DoSomething;
begin
ShowMessageFmt( 'Field1: %d'#$D#$A'Field2: %f', [ Field1, Field2 ] );
end;
end.
и, наконец, тестовое приложение, файл -> новое -> приложение форм vcl, перетащите кнопку в форму, включите uCommon.pas в предложение uses, добавьте ссылку на внешний метод
procedure TakeMyFancyRecord(AMyFancyRecord: PMyFancyRecord); stdcall;
external 'testdll.dll' name 'TakeMyFancyRecord';
и в событии нажатия кнопки добавьте
procedure TForm1.Button1Click(Sender: TObject);
var
LMyFancyRecord: TMyFancyRecord;
begin
LMyFancyRecord.Field1 := 2012;
LMyFancyRecord.Field2 := Pi;
TakeMyFancyRecord( @LMyFancyRecord );
end;
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ:
- работает в D2010;
- компилируется на моей машине!
Наслаждайтесь!
Дэвид Хеффернан править
Чтобы быть на 100% ясным, выполняемый метод DoSomething - это метод, определенный в DLL. Метод DoSomething, определенный в EXE, никогда не выполняется в этом коде.
person
Community
schedule
08.12.2011