Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Создание Dll-клона для comdlg32.dll на VC++ 6.0  (Прочитано 22132 раз)
0 Пользователей и 1 Гость смотрят эту тему.
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 » 

Цитата: Serega
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
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 11-11-2003 11:23 » 

Цитата: maksimus

Кстати для создание нормальных имен функций я пользовался 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 )

Вот и вся картина....
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #6 : 11-11-2003 11:52 » 

Цитата: maksimus
1. В принципе наши с тобой различия в коде описания функций дают один и тот-же резутьтат в таблице экспорта Dll.


я думал ты про альтернативу спрашиваешь.

Цитата: maksimus

 приложение.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-лина именно в своем адресном пространстве!!!
Записан
Джон
просто
Администратор

de
Offline 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
Помогающий

de
Offline Offline

« Ответ #10 : 11-11-2003 13:12 » 

Два дилетантских вопроса:
Почему в качестве параметра NULL а не 0 (мало ли как компилятор этот NULL интерпретирует)?

А Dll слабо было продебаггить? Получает ли функция управление или все раньше зависает?
Записан
Джон
просто
Администратор

de
Offline 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."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #12 : 11-11-2003 13:18 » 

Цитата: Diletant
Два дилетантских вопроса:
Почему в качестве параметра 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
Записан
Джон
просто
Администратор

de
Offline 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 » 

Цитата: Джон
Цитата: Diletant
Два дилетантских вопроса:
Почему в качестве параметра NULL а не 0 (мало ли как компилятор этот NULL интерпретирует)?

А Dll слабо было продебаггить? Получает ли функция управление или все раньше зависает?


1. #define NULL ((void *)0)

2. Он же написал где прога вылетает - смотри код екзешника - проблема с указателем на функцию. Кстати, maksimus, с WINAPI он у меня нулевой был, а у тебя.


К чему ты это написал ?
Записан
Джон
просто
Администратор

de
Offline 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 день мучался...
но теперь все ок Улыбаюсь
Записан
Джон
просто
Администратор

de
Offline 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 » 

Да я тут с того момента как рарегистрировался часто бываю,
хороший форум
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #20 : 11-11-2003 14:22 » new

maksimus, спасибо...
Записан

А птичку нашу прошу не обижать!!!
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines