А что за глобальные объекты windows?IceFlame писал(а):Можно разве что использовать глобальные объекты Windows.
Глобальные переменные
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
-
- Сообщения: 6
- Зарегистрирован: 20 янв 2010, 18:00
На этом форуме уже обсуждалась тема обмена данными между приложением (ЕХЕ-файлом) и динамической библиотекой (DLL) через общую память. Даже пример кода приведён.
Вот эта тема (обрати внимание на сообщения с 16 по 23):
http://forum.developing.ru/showthread.php?17179-DLL
Только тебе придётся переставить местами код для EXE-файла и DLL.
В моём примере загружаемая DLL создаёт в куче процесса общедоступный блок памяти, а приложение находит его и использует. А тебе нужно будет наоборот сделать, чтобы приложение выделяло и маркировало память, а DLL-ки находили её и обращались к её данным.
Вот эта тема (обрати внимание на сообщения с 16 по 23):
http://forum.developing.ru/showthread.php?17179-DLL
Только тебе придётся переставить местами код для EXE-файла и DLL.
В моём примере загружаемая DLL создаёт в куче процесса общедоступный блок памяти, а приложение находит его и использует. А тебе нужно будет наоборот сделать, чтобы приложение выделяло и маркировало память, а DLL-ки находили её и обращались к её данным.
Поумнеть несложно, куда труднее от дури избавиться.
Ну что-то вроде этого.
Exe-файл.
Dll:
Только это через одно место получается %)
Exe-файл.
Код: Выделить всё
#include <windows.h>
#include <iostream>
int GlobalVar = 0;
typedef int(__stdcall *INCGLOBALFUNC)();
int main(int argc, char* argv[])
{
HANDLE Dll = LoadLibrary("dll.dll");
INCGLOBALFUNC IncGlobalFunc = (INCGLOBALFUNC)GetProcAddress(Dll,"IncGlobal");
std::cout << "Before: " << GlobalVar << std::endl;
IncGlobalFunc();
std::cout << "After: " << GlobalVar << std::endl;
FreeLibrary(Dll);
Sleep(5000);
return 0;
}
extern "C" int* __declspec(dllexport) __stdcall GetGlobal()
{
return &GlobalVar;
}
Код: Выделить всё
#include <windows.h>
int __stdcall DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
typedef int* (__stdcall *GETGLOBALADDR)();
extern "C" int __declspec(dllexport) __stdcall IncGlobal()
{
HANDLE exe = GetModuleHandle(NULL);
GETGLOBALADDR GetGlobalAddr =(GETGLOBALADDR)GetProcAddress(exe,"GetGlobal");
int* glb=GetGlobalAddr();
*glb = *glb+1;
return *glb;
}