-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);。何もない代わりに。

助けてくれてありがとう。

4

1 に答える 1

0

私はあなたが使おうとしている PRINTDLG API にまったく詳しくありませんが、あなたの MessageBox コードはすべて間違っています。

このMessageBox関数UNICODEは、null で終わる C 文字列 (プリプロセッサによって が定義されているかどうかに応じて、ANSI 文字列または Unicode 文字列) への 2 つのポインターを受け取ります。代わりにウィンドウ ハンドルを渡しています。これは、任意の型の null で終わる 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);
于 2012-07-25T15:34:15.340 に答える