-1

以下编译没有错误或警告,但不会阻碍 IEFrame 窗口,或者至少我知道它无法将该窗口的打印方向更改为横向:

PRINTDLGEX pd;
pd.lStructSize = (DWORD)sizeof(PRINTDLG);    
BOOL GetPrinterDeviceDefaults(struct tagPDA* pd);

BOOL bRet=AfxGetApp()->GetPrinterDeviceDefaults(&pd); 
pd.hwndOwner = FindWindow("IEFrame", NULL);
LPDEVMODE pDevMode = (LPDEVMODE)::GlobalLock(&pd.hDevMode);
pDevMode->dmOrientation = DMORIENT_LANDSCAPE;
::GlobalUnlock(&pd.hDevMode);

我有证据表明代码可能已经获取了 IEFrame 窗口的 hWnd,因为结果MessageBox(0,(LPCSTR)pd.hwndOwner,"[header]",MB_OK);在 msg 中显示了一些文本 gobbledygook。而不是什么都没有。

谢谢你的帮助。

4

1 回答 1

0

我完全不熟悉您尝试使用的 PRINTDLG API,但您的 MessageBox 代码全错了。

MessageBox函数采用两个指向以空字符结尾的 C 字符串(ANSI 字符串或 Unicode 字符串,取决于是否UNICODE由预处理器定义)的指针。相反,您传递的是一个窗口句柄,它不是任何类型的以 null 结尾的 C 字符串——它只是一个仅对内核有意义的不透明数据值。所以当MessageBox试图解释这个字符串时,它会得到一个指向谁知道在哪里的指针,它要么会因访问冲突而崩溃,要么会从内存中读取随机 gobbledygook,直到它遇到一个杂散的 NUL 字节。

通常编译器会在这里给你一个错误,但是通过插入演员表你告诉“没关系,我知道我在做什么,我保证这真的是一个LPCTSTR”,这掩盖了错误。

对此的正确解决方法是将句柄值打印到字符数组中。例如:

#define DIM(x) (sizeof(x)/sizeof((x)[0]))
wchar_t handleStr[64];
_snprintf_s(handleStr, DIM(handleStr), _TRUNCATE, "Handle value: %p", (void*)pd.hwndOwner);
MessageBoxW(NULL, handleStr, L"[header]", MB_OK);
于 2012-07-25T15:34:15.340 回答