#include "windows_dialog.h" #include #include char* OpenFolderDialog(void) { IFileOpenDialog *pFileOpen = NULL; IShellItem *pItem = NULL; PWSTR pszFilePath = NULL; char* result = NULL; // 初始化COM库 HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); if (FAILED(hr)) { return NULL; } // 创建FileOpenDialog对象 hr = CoCreateInstance(&CLSID_FileOpenDialog, NULL, CLSCTX_ALL, &IID_IFileOpenDialog, (void**)&pFileOpen); if (SUCCEEDED(hr)) { // 设置为选择文件夹模式 DWORD options; pFileOpen->lpVtbl->GetOptions(pFileOpen, &options); pFileOpen->lpVtbl->SetOptions(pFileOpen, options | FOS_PICKFOLDERS); // 显示对话框 hr = pFileOpen->lpVtbl->Show(pFileOpen, NULL); if (SUCCEEDED(hr)) { // 获取结果 hr = pFileOpen->lpVtbl->GetResult(pFileOpen, &pItem); if (SUCCEEDED(hr)) { // 获取文件夹路径 hr = pItem->lpVtbl->GetDisplayName(pItem, SIGDN_FILESYSPATH, &pszFilePath); if (SUCCEEDED(hr)) { // 计算所需缓冲区大小并转换宽字符串到多字节字符串 int size_needed = WideCharToMultiByte(CP_UTF8, 0, pszFilePath, -1, NULL, 0, NULL, NULL); result = (char*)malloc(size_needed); if (result) { WideCharToMultiByte(CP_UTF8, 0, pszFilePath, -1, result, size_needed, NULL, NULL); } CoTaskMemFree(pszFilePath); } pItem->lpVtbl->Release(pItem); } } pFileOpen->lpVtbl->Release(pFileOpen); } CoUninitialize(); return result; } void FreeMemory(char* ptr) { if (ptr) { free(ptr); } }