以下代码编译时没有错误或警告,但没有干扰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。而不是什么。

谢谢你的帮助。

最佳答案

我对您要使用的PRINTDLG API一点都不熟悉,但是您的MessageBox代码全都错了。

MessageBox function使用两个指向以null终止的C字符串(ANSI字符串或Unicode字符串,取决于UNICODE是否由预处理器定义)的指针。相反,您传递的是窗口句柄,它不是任何类型的以N结尾的C字符串-它只是一个不透明的数据值,仅对内核有意义。因此,当MessageBox尝试解释该字符串时,它将获得一个指向who-knows-where的指针,并且将因访问冲突而崩溃,或者从内存中读取随机的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);

关于c++ - hWnd上使用的PRINTDLG结构不是同一过程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11639641/

10-13 05:54