C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 124 - Раздел с общими данными в DLL / Win 32 API / Win32 API

Шаг 124 - Раздел с общими данными в DLL

Так как 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;
}

Вот теперь мы сможет запустить три копии программы, а при запуске четвертой копии получим сообщение.

124_1.gif (5623 b)

Но при реализации данного механизма нужно не забывать про синхронизацию так как много процессов будут иметь доступ к одним и тем же данным.


Загрузить проект | | |
Автор Каев Артем.
[AD]