原生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
相关产品推荐
相关产品推荐

