无法为DOCINFO结构预分配名称:StartDoc返回-1问题排查
问题分析与解决
首先,StartDoc()返回-1(对应错误码SP_ERROR)的核心原因是你对DOCINFO.lpszOutput的使用不符合要求:
错误根源
lpszOutput参数要求传入完整的文件路径(包含盘符/目录+文件名),而你只传入了文件名Test Document.pdf。当系统尝试写入文件时,无法确定具体的存储位置(尤其是当前工作目录可能没有写入权限,或者系统默认路径不可用),导致调用失败。
另外,你的代码里有个冗余操作:已经用DOCINFO di{0};初始化了结构,再调用memset(&di, 0, sizeof(di));完全没必要,不过这不是导致失败的直接原因。
修正方案
- 生成完整的输出文件路径,比如获取当前程序所在目录,或者用户文档目录,再拼接文件名;
- 确保路径有写入权限,避免写入系统保护目录(如
C:\Windows)。
修正后的代码示例:
#include <ShlObj.h> #include <string> // 获取用户文档目录 WCHAR docPath[MAX_PATH]; if (SHGetFolderPathW(NULL, CSIDL_MYDOCUMENTS, NULL, 0, docPath) == S_OK) { std::wstring fileName{L"Test Document"}; std::wstring fullPath{docPath}; fullPath += L"\\"; fullPath += fileName + L".pdf"; DOCINFO di{}; // 直接值初始化,无需memset di.cbSize = sizeof(di); di.lpszDocName = fileName.c_str(); di.lpszOutput = fullPath.c_str(); int docStarted = StartDoc(hdc, &di); if (docStarted == SP_ERROR) { // 调用GetLastError()获取具体错误码排查 DWORD err = GetLastError(); // 处理错误,比如打印错误码 } }
额外排查建议
如果还是失败,调用GetLastError()获取具体错误码,常见的错误包括:
ERROR_PATH_NOT_FOUND:路径不存在(比如你指定的目录没创建)ERROR_ACCESS_DENIED:没有写入权限ERROR_INVALID_NAME:文件名包含非法字符
内容的提问来源于stack exchange,提问作者RDP248
相关产品推荐
相关产品推荐

