Глобальные переменные

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

T_Dmitry_L
Сообщения: 6
Зарегистрирован: 20 янв 2010, 18:00

IceFlame писал(а):Можно разве что использовать глобальные объекты Windows.
А что за глобальные объекты windows?
Аватара пользователя
Decoder
Сообщения: 308
Зарегистрирован: 19 фев 2008, 23:11
Откуда: Moscow

На этом форуме уже обсуждалась тема обмена данными между приложением (ЕХЕ-файлом) и динамической библиотекой (DLL) через общую память. Даже пример кода приведён.
Вот эта тема (обрати внимание на сообщения с 16 по 23):
http://forum.developing.ru/showthread.php?17179-DLL
Только тебе придётся переставить местами код для EXE-файла и DLL.
В моём примере загружаемая DLL создаёт в куче процесса общедоступный блок памяти, а приложение находит его и использует. А тебе нужно будет наоборот сделать, чтобы приложение выделяло и маркировало память, а DLL-ки находили её и обращались к её данным.
Поумнеть несложно, куда труднее от дури избавиться.
IceFlame
Сообщения: 62
Зарегистрирован: 29 ноя 2009, 03:54

Ну что-то вроде этого.
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;
}
Dll:

Код: Выделить всё

#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;
}
Только это через одно место получается %)
Ответить