Форум — Ответы     (  К темам )
 ?  Lucas: Обмен данными с DLL (26-02-2003 15:48:34)
Сначала философский вопрос: подключаемая DLL загружается в адресное пространство процесса или у нее есть свое адресное пространство?
Теперь вопрос:
Есть основная программа, есть DLL. Еще есть переменная целого типа x (объявляется в основной программе).
Основная программа вызывает функцию из DLL (ну например MyFunc()). Нужно, чтобы эта функция (которая внутри DLL) поменяла содержимое переменной x.
Свежими мозгами предложите свой вариант, потом я расскажу, как делал я
 Георгий (26-02-2003 22:39:39)
С философией у меня туго — доступ наверное реализуется с помошью механизма подчинённых сегментов, а с практикой нормально:
в основной проге

HINSTANCE hDll;
static volatile int globalVariable;
void (*dllInitFunc)(volatile int*);
void (*dllFunc)(void);
hDll=LoadLibrary("test.dll");
if (hDll)
{
dllInitFunc=(void(*)(volatile int*))GetProcAddress(hDll,"dllInitFunc");
dllFunc =(void(*)(void))GetProcAddress(hDll,"dllFunc");
if (dllInitFunc)
{
dllInitFunc(&globalVariable);
if (dllFunc)
{
dllFunc();
dllFunc();
};
}
FreeLibrary(hDll);
};

в DLL

volatile int* AlienVariable=0;
extern "C" void __export __stdcall dllInitFunc(volatile int* ptrV);
extern "C" void __export __stdcall dllFunc(void);
void __stdcall dllInitFunc(volatile int* ptrV)
{
AlienVariable=ptrV;
};
void __stdcall dllFunc(void)
{
(*AlienVariable)++;
};

вроде работает (было одно зависание программы во время второго вызова dllFunc, но оно не повторяется).
 Lucas (27-02-2003 15:42:16)
Идеология у меня точно такая же (ну конечно не с точностью до запятой :))), и в таком вот простом варианте тоже все классно работает, но вот стоит только усложнить код DLL (причем некак не связанный с этой переменной), так начинаются всякие синие экраны мерещиться, типа: "программа вызвала сбой по адресу ... и будет закрыта". В чем глюк, не пойму... Ведь изменения кода никаким местом не касаются этой переменной...
 Георгий (27-02-2003 16:30:09)
А что значит усложнить?
Добавить пару функций или усложнить готовые функции — покажи, после чего всё вылетает с ошибкой.
Кстати попробуй в окне Debug->CPU Window посмотреть, что именно вызывает ошибку
 Petro (07-03-2003 14:29:05)
Ответ на философский вопрос: да, в адресное пространство процесса. Стек процесса. При этом несколько длл могут иметь общие сегменты данных и приватные.
 Георгий (07-03-2003 14:47:17)
Petro
а как передаются аргументы? через стек вызова? т.е. железка (процессор) копирует данные из одного стека в другой или как?
 Petro (26-03-2003 09:44:47)
Аргументы можно передавать по-разному. Через регистры, стек, сегмент данных. При этом копировать ничего не нужно, стек у длл и проги общий.