首页
社区
课程
招聘
[求助]请教一个DLL的简单问题
发表于: 2008-8-12 16:48 7327

[求助]请教一个DLL的简单问题

2008-8-12 16:48
7327
因公司的一套系统要加个小功能,由于没有源码,只能自己写DLL了,我现在想在一个DLL写入这个模块的操作界面(以前没有写过),所以就先写个测试程序,

我把代码补齐
//在VC6设置 Project->Project Dependencies 设置DLL 依赖test运行

//main.h
#include "windows.h"
#include "stdafx.h"
#include "resource.h"

BOOL CALLBACK DlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam);

extern "C" _declspec(dllexport) void ShowDlg();

//main.cpp
#include "stdafx.h"
#include "resource.h"

BOOL CALLBACK DlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam);

extern "C" __declspec(dllexport) void ShowDlg();

HINSTANCE hinst          = NULL;
HWND          hwndDLG = NULL;

BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                                         )
{
        switch(ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
                        hinst = (HINSTANCE)hModule;

        case DLL_PROCESS_DETACH:
                break;
        }

    return TRUE;
}

extern "C" __declspec (dllexport) void ShowDlg()
{
        hwndDLG = CreateDialog(hinst,MAKEINTRESOURCE(IDD_DIALOG_MAIN),NULL,(DLGPROC)DlgProc);

        ShowWindow(hwndDLG,SW_SHOW);
}

BOOL CALLBACK DlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)
{
        switch(message)
        {
                case WM_INITDIALOG:
                         return TRUE;

                case WM_COMMAND:

                         return TRUE;

                case WM_CLOSE:
                         DestroyWindow(hDlg);
                         hwndDLG = NULL;
                         return TRUE;
        }
        return FALSE;       
}

//test.cpp   调用DLL
include <windows.h>
#include "main.h"

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                                        PSTR szCmdLine, int iCmdShow)
{
        static TCHAR         szAppName[] = TEXT ("Test") ;
        HWND                                         hwnd ;
        MSG                                          msg ;
        WNDCLASS                             wndclass ;
       
        wndclass.style                         = CS_HREDRAW | CS_VREDRAW ;
        wndclass.lpfnWndProc                   = WndProc ;
        wndclass.cbClsExtra                    = 0 ;
        wndclass.cbWndExtra                    = 0 ;
        wndclass.hInstance                     = hInstance ;
        wndclass.hIcon                         = LoadIcon (NULL, IDI_APPLICATION) ;
        wndclass.hCursor                       = LoadCursor (NULL, IDC_ARROW) ;
        wndclass.hbrBackground         = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
        wndclass.lpszMenuName          = NULL ;
        wndclass.lpszClassName         = szAppName ;

           //刚刚不小心漏掉了 补上
           if (!RegisterClass (&wndclass))
                   {
                          return 0 ;
                        }

               
        hwnd = CreateWindow (szAppName, TEXT ("Test"),
                                                WS_OVERLAPPEDWINDOW,
                                                CW_USEDEFAULT, CW_USEDEFAULT,
                                                CW_USEDEFAULT, CW_USEDEFAULT,
                                                NULL, NULL, hInstance, NULL) ;

       
        ShowWindow (hwnd, iCmdShow) ;
        UpdateWindow (hwnd) ;
       
        while (GetMessage (&msg, NULL, 0, 0))
        {
                TranslateMessage (&msg) ;
                DispatchMessage (&msg) ;
        }
        return msg.wParam ;
}       

LRESULT CALLBACK WndProc (        HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{

        switch (message)
        {
        case        WM_CREATE:
                        return 0;
        case         WM_PAINT:
                        return 0 ;
        case        WM_MOUSEMOVE:                  // 简单设置鼠标移动消息来触发调用D
                        ShowDlg();
                        return 0;
        case         WM_DESTROY:
                        PostQuitMessage (0) ;
                        return 0 ;
        }
        return DefWindowProc (hwnd, message, wParam, lParam) ;
}

具体测试代码我放在附件里面了,先谢谢了

当我调用这个DLL的到处函数ShowDlg(),发现没有窗体出来,请问是怎么回事呢?
麻烦知道的大大帮忙一下,感谢不尽

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 248
活跃值: (1056)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
...
RegisterClassEx
...
CreateWindowEx
...
xx-> CreateDialog(hinst,MAKEINTRESOURCE(IDD_DIALOG_MAIN),NULL,(DLGPROC)DlgProc)
2008-8-12 17:11
0
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
3
最好附上完整的代码,方便别人搭建环境帮你调试.
2008-8-12 17:39
0
雪    币: 209
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
似乎你的hinst参数有问题
2008-8-12 20:56
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
hinst 其实我只是存储一下以后备用而已,这个应该和程序没太大的关系了
2008-8-13 09:12
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
在 CreateWindow()函数之前应该调用RegisterClass()注册一下窗口类.
2008-8-13 11:02
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
不小心copy漏掉了  补上
2008-8-13 11:09
0
雪    币: 209
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
是吗? hwndDLG = CreateDialog(hinst,MAKEINTRESOURCE(IDD_DIALOG_MAIN),NULL,(DLGPROC)DlgProc);
那这行中的hinst按照MSDN,应该是DLL模块的HANDLE,还是应用程序的HANDLE?
2008-8-13 13:08
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
1, 你在写代码的时候.数据的有效性检查一定要做.
2, 主要问题是出在CreateDialog函数上. 看MSDN的介绍这个函数的第三个参数应该是一个HWND,不可以为NULL.
3, 你那个用MOUSE_MOVE消息去调用的话. 实在不够明智. 因为我试的时候鼠标一动就要调用一次啊!:)
2008-8-13 13:29
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
您说的有道理,又看了一下msdn,
hInstance
Identifies an instance of the module whose executable file contains the dialog box template.

这个应该是DLL的,我用GetModuleHandle("DLL文件")取得hInstance,但还是没有反应
2008-8-13 14:31
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
谢谢你的建议
当时只是随便写了个消息,哈哈,没顾及那么多呢。

我在ShowDlg中设置一个参数 变成ShowDlg(HWND hwnd),然后在TEST.cpp中调用ShowDlg时传入hwnd,好像还是不可以。
2008-8-13 15:06
0
雪    币: 153
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
CreateDialog???
这个的话要在主窗口中处理消息的IsDialogMessage.
为什么不用DialogBox????
2008-8-13 16:21
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
vb的不太懂,delphi的还明白点
2008-8-14 21:28
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
2008-8-15 11:25
0
雪    币: 200
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
建议看一下aogosoft.com上面的一篇文章使用DLL中的资源!  
http://www.aogosoft.com/downpage.asp?mode=viewtext&id=55
2008-8-15 14:10
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
谢谢回复,问题已经基本解决了
2008-8-18 15:33
0
游客
登录 | 注册 方可回帖
返回
//