Форум программистов, компьютерный форум CyberForum.ru

Изменение функции для DllMain - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
NatNiM
0 / 0 / 0
Регистрация: 01.05.2009
Сообщений: 68
01.08.2012, 10:49     Изменение функции для DllMain #1
Здравствуйте.

Вот есть файл cpp, в нем DllMain:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include "stdafx.h"
#include "windows.h"
#include "header_dll.h"
#include "resource_dll.h"
 
HINSTANCE hInstance;
INT_PTR CALLBACK DialogProc(HWND hwndDlg,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
)
{
    switch(uMsg) {
        case WM_CLOSE:
            EndDialog(hwndDlg,0);
            break;
        default:
            return FALSE;
    }
    return TRUE;
}
/*
int WINAPI DllMain(HINSTANCE hInstance, DWORD fdReason, PVOID pvReserved) 
 { 
     ::hInst = hInstance; 
  return TRUE; 
 } */
 
EXPORT int CALLBACK ClientInitilalize(HWND hWnd, void *) 
{ 
    DialogBox(::hInst,
              MAKEINTRESOURCE(IDD_DIALOG1), 
              hWnd,
              DialogProc);
  return 1; 
} 
 
EXPORT int CALLBACK servExecute()
{
    return 1;
}
Скопировала этот код в другую в мою dll с функцией DllMain:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
HINSTANCE hDLL = NULL;
//------------------------------------------------------------------------------
 
BOOL WINAPI DllMain
(
    HANDLE hinstDLL,
    DWORD dwReason,
    LPVOID lpvReserved
)
{
    try
    {
        switch (dwReason)
        {
            case DLL_PROCESS_ATTACH:
            hDLL = (HINSTANCE)hinstDLL;
                
            //...
            break;
 
            case DLL_PROCESS_DETACH:
                          //...
            return TRUE;
        }
    }
    catch (...)
    {
        return FALSE;
    }
    return TRUE;
}
Подскажите, пожалуйста, как можно подправить функцию ClientInitilalize (что вписать вместо hInst?)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2012, 10:49     Изменение функции для DllMain
Посмотрите здесь:

Изменение указателя - аргумента функции C++
Изменение функции C++
C++ где искать DllMain в ATL 7.0
Изменение массива в функции C++
C++ Изменение кода в виде функции
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
01.08.2012, 10:55     Изменение функции для DllMain #2
Цитата Сообщение от NatNiM Посмотреть сообщение
Подскажите, пожалуйста, как можно подправить функцию ClientInitilalize (что вписать вместо hInst?)
- можешь NULL но лучше сделай такой протоип функции
EXPORT int CALLBACK ClientInitilalize(HWND hWnd, HINSTANCE hClient) и запихивай туда HINSTANCE клиентского приложения получаемого из WinMain
NatNiM
0 / 0 / 0
Регистрация: 01.05.2009
Сообщений: 68
01.08.2012, 12:06  [ТС]     Изменение функции для DllMain #3
Сделал вот так:

C++
1
2
3
4
5
6
7
8
9
10
HINSTANCE hInstance = hDll;
...
EXPORT int CALLBACK ClientInitilalize(HWND hWnd, HINSTANCE hInstance) 
{ 
    DialogBox(hInstance,
              MAKEINTRESOURCE(IDD_DIALOG1), 
              hWnd,
              DialogProc);
  return 1; 
}
ругается, что не определен hDll, хотя заголовочный файл подключен

C++
1
2
3
4
5
#ifndef _DTCD_NEW_H
#define _DTCD_NEW_H
 
extern HINSTANCE hDLL;
#endif //_DTCD_NEW_H
Добавлено через 3 минуты
Извиняюсь, разница в регистре.
Скомпилилось. Спасибо!

Добавлено через 39 минут
А вот пытаюсь вызвать из приложения dll-ку с функцией отображения окна:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
 
    switch (message)
    {
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        // Parse the menu selections:
        switch (wmId)
        {
        case IDM_ABOUT:
            {
                HMODULE hModule = LoadLibrary(L"D:\\!_Repository\\AdminTools\\trunk\\release\\x86\\DEVICE\\uspd164_01m_un.dll");
                 /*
                Wind lpClientInit = (Wind)GetProcAddress(hModule,"Window");
                lpClientInit();
                if (lpClientInit == NULL)
                {
                  int errorCode = GetLastError();
                } 
                //else {MessageBox(hWnd,L"хорошо", L"message", MB_OK);
                //}
                FreeLibrary(hModule);*/
                typedef int (CALLBACK *lpClientInitilalize)(HWND , void *); 
                lpClientInitilalize lpClientInit = (lpClientInitilalize)GetProcAddress(hModule,"ClientInitilalize");
                lpClientInit(hWnd,NULL);
                FreeLibrary(hModule);
 
            }
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        // TODO: Add any drawing code here...
        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
Окно не запускается, может быть в параметрах напутал?
-=ЮрА=-
Заблокирован
Автор FAQ
01.08.2012, 13:12     Изменение функции для DllMain #4
NatNiM, в вызове функции lpClientInit(hWnd,NULL); вместо NULL поставь Hinstance из WinMain + грузи ДЛЛ в WinMain а не WindowProc.
NatNiM
0 / 0 / 0
Регистрация: 01.05.2009
Сообщений: 68
01.08.2012, 14:03  [ТС]     Изменение функции для DllMain #5
Позвольте привести весь код cpp-шный.
Можно ли обойтись без перенесения в _tWinMain того, что происходит в WindowProc?
В tWinMain параметров некоторых нет, которые используются в WindowProc?
Простите, конечно, за такие дилетантские вопросы
-=ЮрА=-
01.08.2012, 14:05     Изменение функции для DllMain
  #6

Не по теме:

NatNiM, можешь написать задание полностью?Мой ответ в личке да

Yandex
Объявления
01.08.2012, 14:05     Изменение функции для DllMain
Ответ Создать тему
Опции темы

Текущее время: 03:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru