《Windows核心编程》中的问题,SDK高手请进

virtualmfc 2002-03-20 11:09:01
本人最近在学习《Windows核心编程》这本书 , 在练习书中第一章的例子时 ,
出现下面的问题 , 不知问题出在哪里,望高手指点:
1、UNICODE和_UNICODE宏有什么区别
2、xHANDLE_DLGMSG宏作为对话框过程的处理函数宏, 其实现主要是调用
HANDLE_##message系列宏,而后者可能为空,那么能用Return返回到对话
框过程中吗?
3、程序出现了编译错误,总提示DialogBoxParamA出错,但参数却没有问题。
程序比较长,望高手能耐心看完。

#include <windows.h>
#include <windowsx.h>
#include <tchar.h>
#include "resource.h"

#ifndef _M_IX86
#define UNICODE
#endif

#ifdef UNICODE
#define _UNICODE
#endif

#define xHANDLE_DLGMSG(hwnd,message,fn) \
case(message): \
return SetDlgMsgResult(hwnd,message, \
HANDLE_##message((hwnd),(wParam),(lParam),(fn)))

#define ESM_POKECODEANDLOOKUP (WM_USER + 100)

BOOL Dlg_OnInitDialog(HWND hwnd,HWND hwndFocus,LPARAM lParam)
{
Edit_LimitText(GetDlgItem(hwnd,IDC_ERRORCODE),5);

SendMessage(hwnd,ESM_POKECODEANDLOOKUP,lParam,0);

return TRUE;
}

void Dlg_OnCommand(HWND hwnd,int id,HWND hwndCtl,UINT codeNotify)
{
switch(id)
{
case IDCANCEL:
EndDialog(hwnd,id);
break;
case IDC_ALWAYSONTOP:
SetWindowPos(hwnd,IsDlgButtonChecked(hwnd,IDC_ALWAYSONTOP)?HWND_TOPMOST:HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE);
break;
case IDC_ERRORCODE:
EnableWindow(GetDlgItem(hwnd,IDOK),Edit_GetTextLength(hwndCtl)>0);
break;
case IDOK:
DWORD dwError = GetDlgItemText(hwnd,IDC_ERRORCODE,NULL,FALSE);
/*Not Finish...*/
break;
}
}

INT_PTR WINAPI Dlg_Proc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
xHANDLE_DLGMSG(hwndDlg,WM_INITDIALOG,Dlg_OnInitDialog);
xHANDLE_DLGMSG(hwndDlg,WM_COMMAND,Dlg_OnCommand);

case ESM_POKECODEANDLOOKUP:
SetDlgItemInt(hwndDlg,IDC_ERRORCODE,(UINT)wParam,FALSE);
FORWARD_WM_COMMAND(hwndDlg,IDOK,GetDlgItem(hwndDlg,IDOK),BN_CLICKED,PostMessage);
SetForegroundWindow(hwndDlg);
break;
}

return FALSE;
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE,LPTSTR lpCmdLine,int)
{
HWND hwnd;
hwnd = FindWindow(TEXT("#32770"),TEXT("Error Show"));
if(IsWindow(hwnd))
{
SendMessage(hwnd,ESM_POKECODEANDLOOKUP,_ttoi(lpCmdLine),0);
}
else
{
DialogBoxParam(hInstance,MAKEINTRESOURCE(IDD_ERRORSHOW),NULL,Dlg_Proc,_ttoi(lpCmdLine));
}

return 0;
}


下面是编译出错的信息提示:
--------------------Configuration: ErrorShow - Win32 Debug--------------------
Compiling...
ErrorShow.cpp
C:\Program Files\Microsoft Visual Studio\MyProjects\ErrorShow\ErrorShow.cpp(77) : error C2664: 'DialogBoxParamA' : cannot convert parameter 4 from 'long (struct HWND__ *,unsigned int,unsigned int,long)' to 'int (__stdcall *)(struct HWND__ *,unsigned
int,unsigned int,long)'
None of the functions with this name in scope match the target type
Error executing cl.exe.

ErrorShow.exe - 1 error(s), 0 warning(s)
...全文
98 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
virtualmfc 2002-03-25
  • 打赏
  • 举报
回复
Up
virtualmfc 2002-03-23
  • 打赏
  • 举报
回复
没人知道答案吗???
wzaen 2002-03-20
  • 打赏
  • 举报
回复
INT_PTR WINAPI Dlg_Proc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)改为int WINAPI Dlg_Proc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
code_cold 2002-03-20
  • 打赏
  • 举报
回复
1)
_UNICODE: CRT macro
UNICODE: Windows macro
2)
没清楚你要说什么
3)
changed to:
DialogBoxParam(...,(DLGPROC) Dlg_Proc);
expert_zh 2002-03-20
  • 打赏
  • 举报
回复
第二个估计不会出错,你完全可以为一个窗口指定一个空过程
expert_zh 2002-03-20
  • 打赏
  • 举报
回复
BOOL CALLBACK Dlg_Proc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);

kaitty 2002-03-20
  • 打赏
  • 举报
回复
你的第二个问题我不太明白。
kaitty 2002-03-20
  • 打赏
  • 举报
回复
#define UNICODE //你自己定义的符号
#endif

#ifdef UNICODE
#define _UNICODE //系统宏
#endif
你也可以写为
#define MYMACRO //你自己定义的符号
#endif

#ifdef MYMACRO
#define _UNICODE //系统宏
#endif
但不能改_UNICODE,因为编译器认识这个宏
kaitty 2002-03-20
  • 打赏
  • 举报
回复
函数申明改为
int WINAPI Dlg_Proc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
virtualmfc 2002-03-20
  • 打赏
  • 举报
回复
没有错!!!我按时各位大侠的指示,将对话框过程的声明中返回类型由
INT_PTR改为int就行了。
可是我还有点疑问,MSDN上明明类型是这样的,为什么会错呢?
我想知道个究竟。

是不是每个对话框的内存结构都有四个保留位用来存储返回值,而且该保留位
紧跟在对话框的其他结构后面呢?这跟WINDOWS窗口类结构中的保留位有什么关系
吗?

另外,我的第二个问题其实也很简单,因为从下面的声明可以看出:
int WINAPI Dlg_Proc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
返回值是整型,可是在处理WM_COMMAND消息时,返回值为void,那么
xHANDLE_DLGMSG中不是有误吗?因为HANDLE_#message对应到了
void On_DlgCommand。

还有,我看书上的英文解释是UNICODE宏表明使用的是WINDOWS的UNICODE函数版本
,而_UNICODE是使用C运行库的UNICODE版本, 是这样的吗?

大侠们赶紧发言,只要问题解决,立即给分!!!
拜托!!!

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧