Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π‘ΠΎΠ²Π΅Ρ‚Ρ‹ ΠΏΠΎ Delphi. ВСрсия 1.4.3 ΠΎΡ‚ 1.1.2001Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 8

Автор Π’Π°Π»Π΅Π½Ρ‚ΠΈΠ½ ΠžΠ·Π΅Ρ€ΠΎΠ²

handle := WinExec(…);

if handle >= 32 then

while GetModuleUsage(handle) > 0 do Delay(nn);

else raise …

(AM): Π§Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π»ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ GetProcessTimes(), ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ lpExitTime.

(Win32) Для ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ процСсса β€” TerminateProcess.

(Win16) (RR): Надо ΠΏΠΎΡΠ»Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ сообщСниС WM_QUIT:

Handle := Winexec(App, 0);

PostMessage(Handle, WM_QUIT, 0, 0);

ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π² Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ

Пангин Π”ΠΌΠΈΡ‚Ρ€ΠΈΠΉ Π’ΠΈΠΊΡ‚ΠΎΡ€ΠΎΠ²ΠΈΡ‡ прислал письмо ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ содСрТания:

ΠŸΡ€ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ MDI-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ Π·Π°Π΄Π°Ρ‡Π°: Если ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΊΠ»ΠΈΠΊΠ½ΡƒΠ» Π½Π° Ρ„Π°ΠΉΠ»Π΅, Ρ‚ΠΈΠΏ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ поддСрТиваСтся создаваСмым ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, Ρ‚ΠΎ, Ссли ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡƒΠΆΠ΅ Π·Π°ΠΏΡƒΡ‰Π΅Π½ΠΎ, Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ копию прилоТСния, Π° Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π² ΡƒΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π― сдСлал это Ρ‚Π°ΠΊ (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΅ΡΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ красивоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅):

\\ Π’ Ρ„Π°ΠΉΠ»Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°:

var

 i: integer;

 hMainForm:hwnd;

 copyDataStruct:TCopyDataStruct;

 ParamString:string;

 WParam,LParam:integer;

begin

 \\ ΠΈΡ‰Π΅ΠΌ Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ прилоТСния, вмСсто Caption - nil,

 \\ ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΡƒ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒΡΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ MDIChild

 \\ (Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎΠ± ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈΠΌΠ΅Π½ΠΈ класса Π³Π»Π°Π²Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹)

 hMainForm:= FindWindow('TMainForm', nil);

 if  hMainForm = 0 then begin

Application.Initialize;

  Application.CreateForm(TFrmMain, frmMain);

  for i:=1 to ParamCount do TMainForm(Application.MainForm).OpenFile(ParamStr(i));

  Application.Run;

 end

 else begin

ParamString:='';

  for i:=1 to ParamCount do begin

   \\ Π·Π°ΠΏΠΈΡ…ΠΈΠ²Π°Π΅ΠΌ всС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π² ΠΎΠ΄Π½Ρƒ строку с раздСлитСлями ?13

   ParamString:=ParamString+ParamStr(i)+ #13;

  end;

  \\ создаСм запись Ρ‚ΠΈΠΏΠ° TCopyDataStruct

  CopyDataStruct.lpData:=PChar(ParamString);

  CopyDataStruct.cbData:=Length(ParamString);

  CopyDataStruct.dwData:=0;

  WParam:=Application.Handle;

  LParam:=Integer(@CopyDataStruct);

  \\ отсылаСм сообщСниС WM_COPYDATA Π³Π»Π°Π²Π½ΠΎΠΌΡƒ ΠΎΠΊΠ½Ρƒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ прилоТСния

  SendMessage(hMainForm,WM_CopyData,WParam,LParam);

  Application.Terminate;

 end;

end.


\\ ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сообщСния WM_COPYDATA

procedure TMainForm.CopyData(var Msg: TWMCopyData);

var

 ParamStr:string;

 CopyDataStructure:TCopyDataStruct;

 i:integer;

 len:integer;

begin

 CopyDataStructure:= Msg.CopyDataStruct^;

 ParamStr:='';

 len:=  CopyDataStructure.cbData;

 for i:=0 to len-1 do begin

ParamStr:=ParamStr+(PChar(CopyDataStructure.lpData)+i)^;

 end;

 i:=0;

 while not(Length(ParamStr)=0) do begin

  if isDelimiter(#13,ParamStr,i) then begin

OpenFile(Copy(ParamStr,0,i-1));

   ParamStr:=Copy(ParamStr,i+1,Length(ParamStr)-i-1);

  end;

  inc(i);

 end;

 inherited;

end;

Π£Π±ΠΈΠ²Π°Π΅ΠΌ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅

The_Sprite прислал письмо ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ содСрТания:

Данная функция позволяСт Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ любой Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠΎ Π΅Ρ‘ classname ΠΈΠ»ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΡƒ ΠΎΠΊΠ½Π°.

Π‘ΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ: ВсС вСрсии Delphi

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

procedure KillProgram(Classname : string; WindowTitle : string);

const

 PROCESS_TERMINATE = $0001;

var

 ProcessHandle : THandle;

 ProcessID: Integer;

 TheWindow : HWND;

begin

 TheWindow := FindWindow(Classname, WindowTitle);

 GetWindowThreadProcessID(TheWindow, @ProcessID);

 ProcessHandle := OpenProcess(PROCESS_TERMINATE, FALSE, ProcessId);

 TerminateProcess(ProcessHandle, 4);

end;

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

Xianguang Li=(22 ΠžΠΊΡ‚ΡΠ±Ρ€Ρ 2000) Π’ Delphi 5, ΠΏΡ€ΠΈ компиляции получаСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ошибка:

Incompatible types: 'String' and 'PChar'.

ПослС измСнСния выраТСния

TheWindow := FindWindow(ClassName, WindowTitle)

Π½Π°

TheWindow := FindWindow(PChar(ClassName), PChar(WindowTitle))

ΠΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π»ΠΎΡΡŒ.

И Π΅Ρ‰Ρ‘: Ссли ΠΌΡ‹ Π½Π΅ Π·Π½Π°Π΅ΠΌ ClassName ΠΈΠ»ΠΈ WindowTitle ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡƒΠ±ΠΈΡ‚ΡŒ, Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ смоТСм Π΅Ρ‘ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ нСльзя Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² Π²ΠΈΠ΄Π΅:

KillProgram(nil, WindowTitle)

ΠΈΠ»ΠΈ

KillProgram(ClassName, nil)

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Π½Π΅ позволяСт ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ nil Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ‚ΠΈΠΏΠ° String.

Π˜Ρ‚Π°ΠΊ, я ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ» объявлСниС

KillProgram(ClassName: string; WindowTitle: string)

Π½Π°

KillProgram(ClassName: PChar; WindowTitle: PChar),

Π²ΠΎΡ‚ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ функция Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ любоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Ссли Π²Ρ‹ Π½Π΅ Π·Π½Π°Π΅Ρ‚Π΅ ClassName ΠΈΠ»ΠΈ WindowTitle этого прилоТСния.

Pascal

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° цикличСских ссылок

Π£ мСня имССтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ A ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ B, ΠΈ ΠΈΠΌ ΠΎΠ±ΠΎΠΈΠΌ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π΄Ρ€ΡƒΠ³ друга…

ΠžΠ±ΡŠΡΠ²ΠΈΡ‚Π΅ абстрактный Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ интСрфСйс класса для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ классы ΠΌΠΎΠ³Π»ΠΈ Π΅Π³ΠΎ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ абстрактныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ свойства. Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ классы подклассами Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса (ΠΏΡ€ΠΈ нСобходимости). Π”Π°Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ сущСствСнно ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π² структурировании вашСго прилоТСния.

Mike Scott.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ мноТСства экзСмпляров

Delphi 1

list:=Tlist.create;

For i:= 1 to 1000 do begin

 SSObject:=TSSObject.create;

 {помСститС ΠΊΡƒΠ΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ссылку Π½Π° созданный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ - Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² Tlist}

 list.add(SSObject);

end;

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹

ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°

Delphi 1

Π’ нашСм случаС Π»ΡƒΡ‡ΡˆΠΈΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ использованиС ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. Допустим, Ρ‡Ρ‚ΠΎ DllFunction() Π½Π° Π²Ρ…ΠΎΠ΄Π΅ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, поясним это Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΊΠΎΠ΄Π°:

type TMyFuncType = function: integer;

var MyFunc : TMyFuncType;


function foo: integer;

begin

 result := 1;

end;


begin

 MyFunc := foo;

 DllFunction(longint(MyFunc));

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈ Ρ‚Π°ΠΊ:

DllFunction(longint(@foo));

ВсС ΠΆΠ΅ я Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½ Π² вопросах коррСктности использования Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π² Π²Ρ‹Π·ΠΎΠ²Π°Ρ… DLL памяти (для мСня ΠΏΠΎΠΊΠ° нСясна Ρ€Π°Π±ΠΎΡ‚Π° с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, находящСйся Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ сСгмСнтС), ΠΊΠ°ΠΊ Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ для ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π²Π°ΠΌ придСтся ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ foo с Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ far, ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅, ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΅Ρ‰Π΅.

Π’Π°ΠΊΠΆΠ΅, Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ написана DllFunction(), Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π² Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ°:

function DllFunction(p: TMyFuncType): Integer; far; external 'mydll';

Π’ этом случаС Π²Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ пСрСмСнная MyFunc ΠΈΠ»ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ @.

Π’ Delphi/Pascal Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ этим Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для компилятора ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ (я Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΠ» ΠΈ тСстировал):

unit Unit1;


interface


uses

 SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,Forms, Dialogs, StdCtrls;


type

 TForm1 = class(TForm)

  Button1: TButton;

  Button2: TButton;

  procedure Button1Click(Sender: TObject);

  procedure Button2Click(Sender: TObject);

 private { Private declarations }

 public { Public declarations }

 end;


var

 Form1: TForm1;


implementation


{$R *.DFM}


type

 IntFunc = function: integer;


function DllFunction(iFunc: IntFunc): integer; far;

begin

 DllFunction := iFunc; {ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ это Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ}

end;


function iFoo: integer; far;

begin

 iFoo := 1;

end;


procedure TestIFunc;

var

 i: integer;

begin

 i := DllFunction(iFoo);

end;


procedure TForm1.Button1Click(Sender: TObject);

begin

 TestIFunc;

end;


procedure TForm1.Button2Click(Sender: TObject);

begin

 Close;

end;


end.