maksimus
Гость
|
|
« : 11-11-2003 09:02 » |
|
Пытаюсь создать Dll, для того чтоб подсунуть ее одному приложению вместо comdlg32.dll, а в ней уже вызывать функции настоящей comdlg32.dll. Суть вопросса: При вызове функций из моей dll-ны выполнение программы останавливаеться и загрузка процы стоит на 100%, вопросс в том, почему это происходит?
Исходник проги использующей dll:
#include <windows.h> #include <iostream.h>
int main(int argc, char* argv[]) { typedef BOOL (WINAPI *mproc)(DWORD); HMODULE hmod = LoadLibrary("e:\\work\\cpp\\comdlg32\\release\\comdlg32.dll"); mproc p = reinterpret_cast<mproc>( GetProcAddress(hmod,"ChooseColorA")); cout << "Lib address:" << hmod << endl; cout << "Proc address:" << p << endl; cout << "Run proc:" << endl; cout << p(NULL) << endl; //Вот именно здесь все и останавливаеться cout << "End Proc" << endl; FreeLibrary(hmod); return 0; }
Исходник самой Dll:
BOOL WINAPI ChooseColorA(DWORD param); BOOL WINAPI ChooseFontA(DWORD param); BOOL WINAPI GetOpenFileNameW(DWORD name); BOOL WINAPI GetOpenFileNameA(DWORD name); BOOL WINAPI GetSaveFileNameA(DWORD arg0/*, DWORD arg1, DWORD arg2*/); BOOL WINAPI GetSaveFileNameW(DWORD arg0/*, DWORD arg1, DWORD arg2, DWORD argC*/); DWORD WINAPI CommDlgExtendedError(VOID/*DWORD arg0, DWORD arg1, DWORD arg2*/);
HMODULE hmode = NULL;
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: hmode = LoadLibrary("c:\\windows\\system32\\comdlg32.dll"); break; case DLL_THREAD_ATTACH: hmode = LoadLibrary("c:\\windows\\system32\\comdlg32.dll"); break; case DLL_THREAD_DETACH: FreeLibrary(hmode); break; case DLL_PROCESS_DETACH: FreeLibrary(hmode); break; } return TRUE; }
BOOL WINAPI ChooseColorA(DWORD param){ return 0; }
BOOL WINAPI ChooseFontA(DWORD param){ return 0; }
BOOL WINAPI GetOpenFileNameW(DWORD name){ return 0; }
BOOL WINAPI GetOpenFileNameA(DWORD name){ return 0; }
BOOL WINAPI GetSaveFileNameA(DWORD arg0/*, DWORD arg1, DWORD arg2*/){ return 0; }
BOOL WINAPI GetSaveFileNameW(DWORD arg0/*, DWORD arg1, DWORD arg2, DWORD argC*/){ return 0; }
DWORD WINAPI CommDlgExtendedError(VOID/*DWORD arg0, DWORD arg1, DWORD arg2*/){ return 0; }
|
|
|
Записан
|
|
|
|
Serega
Гость
|
|
« Ответ #1 : 11-11-2003 09:24 » |
|
Warning The entry-point function should perform only simple initialization tasks. It must not call the LoadLibrary or LoadLibraryEx function (or a function that calls these functions), because this may create dependency loops in the DLL load order. This can result in a DLL being used before the system has executed its initialization code. Similarly, the entry-point function must not call the FreeLibrary function (or a function that calls FreeLibrary), because this can result in a DLL being used after the system has executed its termination code.
|
|
|
Записан
|
|
|
|
maksimus
Гость
|
|
« Ответ #2 : 11-11-2003 09:31 » |
|
Warning The entry-point function should perform only simple initialization tasks. It must not call the LoadLibrary or LoadLibraryEx function (or a function that calls these functions), because this may create dependency loops in the DLL load order. This can result in a DLL being used before the system has executed its initialization code. Similarly, the entry-point function must not call the FreeLibrary function (or a function that calls FreeLibrary), because this can result in a DLL being used after the system has executed its termination code. Списобо попробую
|
|
|
Записан
|
|
|
|
maksimus
Гость
|
|
« Ответ #3 : 11-11-2003 09:37 » |
|
Закоментил Load и Free Library, не помогает...
Кстати для создание нормальных имен функций я пользовался def-файлом.
Его содержимое:
LIBRARY comdlg32 EXPORTS ChooseColorA ChooseFontA GetOpenFileNameA GetOpenFileNameW GetSaveFileNameA GetSaveFileNameW CommDlgExtendedError
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #4 : 11-11-2003 11:23 » |
|
Кстати для создание нормальных имен функций я пользовался def-файлом. ChooseColorA ChooseFontA GetOpenFileNameA GetOpenFileNameW GetSaveFileNameA GetSaveFileNameW CommDlgExtendedError
Я делаю так: // Exported functions from the DLL #define MY_DEFINE_FOR_EXPORT __declspec)dllexport:
extern "C"|
MY_DEFINE_FOR_EXPORT твой тип ChooseColorA)твои параметры:; ...
" // End extern "C"
только я всё-равно нифига не понял. Как ты хочешь comdlg32.dll загружать если она уже загружена при старте системы? IMHO захучить ((с)SlavaI) её и отлавливать обращение к нужным тебе функциям.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
maksimus
Гость
|
|
« Ответ #5 : 11-11-2003 11:44 » |
|
1. В принципе наши с тобой различия в коде описания функций дают один и тот-же резутьтат в таблице экспорта Dll. 2. Нет, ничего я хучить не хочу, вот схема:
Стандартная схема: приложение.exe-> ( загружает comdlg32.dll ) -> comdlg32.dll
Схема с моей Dll: приложение.exe-> ( загружает comdlg32.dll, но только из той папки где оно находиться, посредством создания файла в этой папке c с именем приложение.exe.local ) -> comdlg32.dll ( а вот моя dll-лина уже вызывает функции настоящей comdlg32.dll )
Вот и вся картина....
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #6 : 11-11-2003 11:52 » |
|
1. В принципе наши с тобой различия в коде описания функций дают один и тот-же резутьтат в таблице экспорта Dll.
я думал ты про альтернативу спрашиваешь. приложение.exe-> ( загружает comdlg32.dll, но только из той папки где оно находиться, посредством создания файла в этой папке c с именем приложение.exe.local ) -> comdlg32.dll ( а вот моя dll-лина уже вызывает функции настоящей comdlg32.dll )
Вот и вся картина....
Дык она уже загружена тем же эксплорером.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
maksimus
Гость
|
|
« Ответ #7 : 11-11-2003 11:57 » |
|
Причем здесь эксплорер? ? dll-лины грузятся в адресное пространство каждого вызывающего их процесса, и в пространство эксплорера тоже, но вот мое приложение к эксплореру не причем так как имеет свое адресное пространство и ему нужна dll-лина именно в своем адресном пространстве!!!
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #8 : 11-11-2003 12:42 » |
|
Вернулся... Ага... Сорри - не увидел, что ты абсолютный путь указываешь. Только это не называется "вместо comdlg32.dll" - просто ты делаешь dll, которая так же называется. А ты уверен, что та прога, которой ты её подсунуть хочешь, тоже этот путь знает?
Ну а по теме - выброси WINAPI (это пережиток).
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
maksimus
Гость
|
|
« Ответ #9 : 11-11-2003 13:00 » |
|
Результат работы с WINAPI и без не изменяеться, а вот приложение если в папке с ним есть файл с именем к примеру : приложение - test.exe файл - test.exe.local , то приложение будет искать dll-лины с начала в своей папке, а потом уже по системным путям.
И если не трудно отвечай по subj'у
|
|
|
Записан
|
|
|
|
Diletant
Помогающий
Offline
|
|
« Ответ #10 : 11-11-2003 13:12 » |
|
Два дилетантских вопроса: Почему в качестве параметра NULL а не 0 (мало ли как компилятор этот NULL интерпретирует)?
А Dll слабо было продебаггить? Получает ли функция управление или все раньше зависает?
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #11 : 11-11-2003 13:13 » |
|
Неправильно, те правильно только в том случае если она не была загружена. А так ты получишь хэндл длл которая уже загружена в системе. А comdlg32 именно такая. Сделай просто LoadLibrary("comdlg32.dll"); и посмотри каким нить процесс-вьювером какая длл загружена. Даже если у тебя она в твоей папке сидит будет с твоим процессом связана из системного фолдера.
Ну я и говорю по теме - выброси WINAPI в длл и в ЕХЕ
в .h
extern "C"{ COMDLG32_API BOOL ChooseColorA(DWORD param); } // End extern "C"
.cpp COMDLG32_API BOOL ChooseColorA(DWORD param) { return 0; }
typedef BOOL (*mproc)(DWORD);
HMODULE hmod = LoadLibrary("d:\\projects\\TestDLL\\_bin\\comdlg32.dll"); mproc p = reinterpret_cast<mproc>( GetProcAddress(hmod,"ChooseColorA"));
только что проверил - работает код екзешника - твой, один в один только без WINAPI
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #12 : 11-11-2003 13:18 » |
|
Два дилетантских вопроса: Почему в качестве параметра NULL а не 0 (мало ли как компилятор этот NULL интерпретирует)?
А Dll слабо было продебаггить? Получает ли функция управление или все раньше зависает? 1. #define NULL ((void *)0) 2. Он же написал где прога вылетает - смотри код екзешника - проблема с указателем на функцию. Кстати, maksimus, с WINAPI он у меня нулевой был, а у тебя.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
maksimus
Гость
|
|
« Ответ #13 : 11-11-2003 13:21 » |
|
Что ты дефайнишь в COMDLG32_API
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #14 : 11-11-2003 13:23 » |
|
сорри забыл
#ifdef COMDLG32_EXPORTS #define COMDLG32_API __declspec(dllexport) #else #define COMDLG32_API __declspec(dllimport) #endif
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
maksimus
Гость
|
|
« Ответ #15 : 11-11-2003 13:26 » |
|
Два дилетантских вопроса: Почему в качестве параметра NULL а не 0 (мало ли как компилятор этот NULL интерпретирует)?
А Dll слабо было продебаггить? Получает ли функция управление или все раньше зависает? 1. #define NULL ((void *)0) 2. Он же написал где прога вылетает - смотри код екзешника - проблема с указателем на функцию. Кстати, maksimus, с WINAPI он у меня нулевой был, а у тебя. К чему ты это написал ?
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #16 : 11-11-2003 13:33 » |
|
эт я Diletant ответил, смотри выше
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
maksimus
Гость
|
|
« Ответ #17 : 11-11-2003 13:37 » |
|
Списибо за помощь, заработало, уже нервов не хватало, 3 день мучался... но теперь все ок
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #18 : 11-11-2003 13:39 » |
|
Удачи! Заходи ещё
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
maksimus
Гость
|
|
« Ответ #19 : 11-11-2003 13:42 » |
|
Да я тут с того момента как рарегистрировался часто бываю, хороший форум
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #20 : 11-11-2003 14:22 » |
|
maksimus, спасибо...
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
|