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

原生Windows C++调用ExifTool获取元数据输出方法求助

原生Windows C++(MFC)调用ExifTool并获取输出的解决方案

核心思路

通过匿名管道重定向ExifTool的标准输出(stdout),用CreateProcess启动ExifTool时指定重定向后的输出句柄,父进程(MFC程序)从管道读取ExifTool输出的元数据。

具体实现步骤及代码示例

1. 创建匿名管道

需创建可被子进程继承的管道句柄,同时确保父进程的读句柄不被继承:

SECURITY_ATTRIBUTES sa = {0};
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;

HANDLE hPipeRead = NULL;
HANDLE hPipeWrite = NULL;
if (!CreatePipe(&hPipeRead, &hPipeWrite, &sa, 0))
{
    AfxMessageBox(_T("创建管道失败"));
    return;
}

// 禁止父进程读句柄被继承
SetHandleInformation(hPipeRead, HANDLE_FLAG_INHERIT, 0);

2. 配置CreateProcess启动参数

指定子进程的标准输出为管道写句柄,确保输出被重定向:

STARTUPINFO si = {0};
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdOutput = hPipeWrite;
si.hStdError = hPipeWrite; // 可选:同时重定向错误输出,便于排查问题

PROCESS_INFORMATION pi = {0};

// 构造ExifTool命令行,路径含空格需加引号
CString strCmd = _T("\"C:\\YourPath\\exiftool.exe\" \"C:\\Test\\target.jpg\"");

// 启动子进程
BOOL bSuccess = CreateProcess(NULL, 
    strCmd.GetBuffer(),
    NULL, NULL, TRUE,
    0, NULL, NULL, &si, &pi);

strCmd.ReleaseBuffer();

if (!bSuccess)
{
    AfxMessageBox(_T("启动ExifTool失败"));
    CloseHandle(hPipeRead);
    CloseHandle(hPipeWrite);
    return;
}

// 父进程关闭管道写句柄(子进程已继承)
CloseHandle(hPipeWrite);

3. 读取管道中的输出

等待子进程结束的同时循环读取输出,确保获取完整结果:

CString strOutput;
char buffer[4096];
DWORD dwRead = 0;

// 等待子进程运行,同时读取输出
while (WaitForSingleObject(pi.hProcess, 100) == WAIT_TIMEOUT)
{
    if (ReadFile(hPipeRead, buffer, sizeof(buffer)-1, &dwRead, NULL) && dwRead > 0)
    {
        buffer[dwRead] = '\0';
        CString strTemp(buffer);
        strOutput += strTemp;
    }
}

// 读取剩余输出
while (ReadFile(hPipeRead, buffer, sizeof(buffer)-1, &dwRead, NULL) && dwRead > 0)
{
    buffer[dwRead] = '\0';
    CString strTemp(buffer);
    strOutput += strTemp;
}

// 清理资源
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
CloseHandle(hPipeRead);

// strOutput即为ExifTool输出的元数据,可传递给其他程序
AfxMessageBox(strOutput);

4. 关键注意事项

  • ExifTool路径和目标文件路径含空格时,必须用双引号包裹。
  • 如需结构化输出,可在命令行添加-j参数(输出JSON格式),便于后续解析。
  • 处理大文件时,可优化读取逻辑,分批次处理输出内容,避免内存占用过高。
  • 所有打开的句柄必须及时关闭,防止资源泄漏。

内容的提问来源于stack exchange,提问作者DocDJ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 00:35:19