在hWnd上使用的PRINTDLG结构不是同一个进程

时间:2012-07-24 21:32:14

标签: c++ c windows winapi

以下编译没有错误或警告,但没有阻止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。而不是一无所获。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我对你尝试使用的PRINTDLG API一点都不熟悉,但你的MessageBox代码都错了。

MessageBox function接受两个指向以空字符结尾的C字符串的指针(ANSI字符串或Unicode字符串,具体取决于预处理器是否定义了UNICODE)。你传递的是一个窗口句柄,它不是任何类型的以null结尾的C字符串 - 它只是一个只对内核有意义的不透明数据值。因此,当MessageBox尝试解释字符串时,它会获得指向who-knows-where的指针,并且它会因访问冲突而崩溃,或者从内存中读取随机gobbledygook,直到它遇到一个迷路的NUL字节。 / p>

通常编译器会在这里给你一个错误,但通过插入演员你会说“没关系,我知道我在做什么,我保证这真是一个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);