Так как DLL находиться в адресном пространстве процесса который ее использует возникает проблеме с общими данными которые могут быть нужны всех процессов. Например в самой DLL подсчитывать количество к ней обращений. К счастью это легко решается. Нужно просто определить данные в общем модуле. Но использовать можно только инициализированные данные. Мы с Вами использует этот механизм, применив его к ограничению на использование DLL несколькими программами. То есть практически создадим DLL защиты, которая будет ограничивать число программ, которые будут обращаться к DLL. Очень похоже на лицензионную политику. Итак, создаем DLL. Дадим имя Users.dll: #include "stdafx.h" #include "windows.h"
#pragma data_seg(".shared") int Countelem=0; #pragma data_seg()
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch(ul_reason_for_call)// проверка подключения { case DLL_PROCESS_ATTACH:// новый процесс Countelem++; if (Countelem>3)// больше трех подключились { MessageBox(NULL,"Not Limit Access","error",MB_OK);// прогнать return FALSE; } break; } return TRUE; }
Надо добавить файл описания модуля - UsersDll.def: LIBRARY "UsersDll" SECTIONS .shared READ WRITE SHARED
Вот, а теперь создадим программу, которая будет эту DLL загружать. #include "stdafx.h" #include "windows.h" #include "iostream.h"
int main(int argc, char* argv[]) { HINSTANCE hi=NULL; hi=LoadLibrary("test.dll"); if (hi!=NULL) { int i; cin >> i; } else cout << "Error Load" << endl; return 0; } Но при реализации данного механизма нужно не забывать про синхронизацию так как много процессов будут иметь доступ к одним и тем же данным. |