Так как 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;
}
Вот теперь мы сможет запустить три копии программы, а при запуске четвертой копии получим сообщение.
Но при реализации данного механизма нужно не забывать про синхронизацию так как много процессов будут иметь доступ к одним и тем же данным.
Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.
Используются технологии uCoz
|