Советы по Delphi



         

Потоки и DLL - часть 2


/p>

Данный код назначает объявленный пользователей метод с именем DLLEntryPoint объявленной глобально переменной Delphi с именем DllProc, в свою очередь объявленой в SYSTEM.PAS следующим образом:

var
.
DllProc: Pointer; { Вызывается каждый раз при вызове точки входа DLL }

Вы можете имитировать стандартную функциональность DLLEntryPoint, вызывая объявленный к тому времени локально DLLEntryPoint, и передавая ему Dll_Process_Attach в качестве переменной. В C/C++ DLL эта переменная должна передаваться определенной пользователем функции с именем DllEntryPoint автоматически при первом доступе к DLL из первой обратившейся к ней программы. В Delphi первый вызов этой функции может быть произведен вручную пользователем, но последующие вызовы происходят автоматически до тех пор, пока вы не назначите первый раз функцию переменной DllProc. Другими словами, вы можете форсировать первый вызов DllEntryPoint как показано выше, но последующие вызовы будут сделаны системой автоматически.

Dll_Process_Attach - одна из четырех возможных констант, которые система можете передавать функции DllEntryPoint. Эти константы объявлены в WINDOWS.PAS следующим образом:

DLL_PROCESS_ATTACH = 1; // Программа подключается к DLLDLL_THREAD_ATTACH = 2; // Поток программы подключается к DLLDLL_THREAD_DETACH = 3; // Поток "оставляет" DLLDLL_PROCESS_DETACH = 0; // Exe "отсоединяется" от DLL

Более детальная скелетная конструкция DllEntryPoint с использованием приведенных констант:

procedure DLLEntryPoint(Reason: DWORD);begincase Reason ofDll_Process_Attach:MessageBox(DLLHandle, 'Подключение процесса', 'Инфо', mb_Ok);Dll_Thread_Attach:MessageBox(DLLHandle, 'Подключение потока', 'Инфо', mb_Ok);Dll_Thread_Detach:MessageBox(DLLHandle, 'Отключение потока', 'Инфо', mb_Ok);Dll_Process_Detach:MessageBox(DLLHandle, 'Отключение процесса', 'Инфо', mb_Ok);end; // caseend;

В приведенном примере я просто вызываю диалог MessageBox в ответ на возможные параметры, передаваемые DLLEntryPoint. Тем не менее, вы могли бы найти более достойное применение данным константам или вовсе игнорировать их.

Работа с потоками

Приведенный ниже небольшой фрагмент кода достоин занять место в программе, вызывающей DLL. Он показывает как можно объявить функцию, экспортируемую из DLL, и как вызвать эту функцию из потока. Конечно, обычно нет необходимости вызывать функцию DLL из потока, я делаю это просто для того, чтобы показать функциональное назначение, связанное с обсуждаемыми выше константами Dll_Thread_Attach и Dll_Thread_Detach.

function MyFunc: ShortString;external 'DLLENTRY1' name 'MyFunc';
procedure ThreadFunc(P: Pointer); stdcall;varS: array[0..255] of Char;beginStrPCopy(S, MyFunc);MessageBox(Form1.Handle, S, 'Инфо', mb_Ok);end;
procedure TForm1.UseThreadClick(Sender: TObject);varThreadID: DWORD;HThread: THandle;beginHThread := CreateThread(nil, 0, @ThreadFunc,nil, 0, ThreadID);if HThread = 0 then ShowMessage('Нет потоков');end;
<


Содержание  Назад  Вперед