Форум — Ответы ( К темам )
? | 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) | |
Аргументы можно передавать по-разному. Через регистры, стек, сегмент данных. При этом копировать ничего не нужно, стек у длл и проги общий.
|