【发布时间】:2010-06-10 11:42:12
【问题描述】:
我正在尝试使用 C++ 打印一些东西。但是,我遇到了一个让我一无所知的奇怪错误,我使用以下代码:
PRINTDLG pd;
ZeroMemory(&pd, sizeof(pd));
pd.lStructSize = sizeof(pd);
pd.Flags = PD_RETURNDEFAULT;
PrintDlg(&pd);
// Set landscape
DEVMODE* pDevMode = (DEVMODE*)GlobalLock(pd.hDevMode);
pDevMode->dmOrientation = DMORIENT_LANDSCAPE;
pd.hwndOwner = mainWindow;
pd.Flags = PD_RETURNDC | PD_NOSELECTION;
GlobalUnlock(pd.hDevMode);
if (PrintDlg(&pd))
{
DOCINFO di;
di.cbSize = sizeof(DOCINFO);
di.lpszDocName = "Test Print";
di.lpszOutput = (LPTSTR)NULL;
di.fwType = 0;
//start printing
StartDoc(pd.hDC, &di);
int a;
int b;
int c;
int d;
int e;
int f;
// int g; // Uncomment this -> CRASH
EndDoc(pd.hDC);
DeleteDC(pd.hDC);
}
else
{
cout << "Did not print: " << CommDlgExtendedError() << endl;
}
我取消注释'int g;'的那一刻我得到一个:“程序收到信号 SIGSEGV,分段错误。”我使用最新的代码块和 mingw 编译器。这可能是什么原因造成的?
【问题讨论】:
-
在哪里发生段错误?
-
没有给出行号,调用栈只给出这个错误:ntdll!RtlLookupAtomInAtomTable()
-
我不知道 DOCINFO 或 lpszDocName 是什么,但这行看起来很可疑:di.lpszDocName = "Test Print";也许需要一个 strcpy 和一些分配?
-
@PeterK 我认为 lpszDocName 中的 lpsz 意味着 long(?) 指向字符串零终止的指针或类似的东西。