You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法为DOCINFO结构预分配名称:StartDoc返回-1问题排查

问题分析与解决

首先,StartDoc()返回-1(对应错误码SP_ERROR)的核心原因是你对DOCINFO.lpszOutput的使用不符合要求:

错误根源

lpszOutput参数要求传入完整的文件路径(包含盘符/目录+文件名),而你只传入了文件名Test Document.pdf。当系统尝试写入文件时,无法确定具体的存储位置(尤其是当前工作目录可能没有写入权限,或者系统默认路径不可用),导致调用失败。

另外,你的代码里有个冗余操作:已经用DOCINFO di{0};初始化了结构,再调用memset(&di, 0, sizeof(di));完全没必要,不过这不是导致失败的直接原因。

修正方案

  1. 生成完整的输出文件路径,比如获取当前程序所在目录,或者用户文档目录,再拼接文件名;
  2. 确保路径有写入权限,避免写入系统保护目录(如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.02 06:33:11