在此代码中,我尝试将目录名称从公共项对话框传递到编辑控件的字符和结构。除了第一个字符之外,几乎所有字符都正确返回。第一个字符始终替换为随机字符或符号。我仍在学习 Win32 API 的所有细节,所以这对我来说没有任何意义。任何帮助将不胜感激。谢谢你。
LPNMHDR pnmh = (LPNMHDR)lParam;
HWND Parent = GetParent(hDialog);
LPCWSTR String = NULL;
switch (Message)
{
case WM_INITDIALOG:
return FALSE;
case WM_NOTIFY:
{
switch (pnmh->code)
{
case PSN_SETACTIVE:
PropSheet_SetWizButtons(Parent, PSWIZB_NEXT | PSWIZB_BACK | PSWIZB_CANCEL);
return FALSE;
}
return FALSE;
}
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case IDC_PjDirBrowse:
{
switch (HIWORD(wParam))
{
case BN_CLICKED:
OpenDirectory (&String);
if (String != NULL)
{
//Load the return folder directory into the appropriate structure and the edit control
Environment.ProjectPath = String;
SetDlgItemTextW(hDialog, IDC_EDIT1, String);
}
return FALSE;
}
}
return FALSE;
}
return FALSE;
}
}
return FALSE;
}
HRESULT OpenDirectory(LPCWSTR *ReturnString)
{
//CoCreate Folder Open Dialog Object
IFileDialog* pfd = NULL;
IID OpenFileID = IID_IFileOpenDialog;
HRESULT hr = CoCreateInstance(&CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER, &IID_IFileOpenDialog, &pfd);
if (SUCCEEDED(hr))
{
//flags
DWORD dwFlags;
hr = pfd->lpVtbl->GetOptions(pfd, &dwFlags);
if (SUCCEEDED(hr))
{
hr = pfd->lpVtbl->SetOptions(pfd, dwFlags | FOS_FORCEFILESYSTEM | FOS_PICKFOLDERS);
if (SUCCEEDED(hr))
{
IShellItem* MyDoccuments;
hr = SHGetKnownFolderItem(&FOLDERID_DocumentsLibrary, KF_FLAG_DEFAULT, NULL, &IID_IShellItem, &MyDoccuments);
if (SUCCEEDED(hr))
{
hr = pfd->lpVtbl->SetFolder(pfd, MyDoccuments);
if (SUCCEEDED(hr))
{
hr = pfd->lpVtbl->Show(pfd, NULL);
if (SUCCEEDED(hr))
{
IShellItem* psiResult;
hr = pfd->lpVtbl->GetResult(pfd, &psiResult);
LPCWSTR pszFilePath = NULL;
hr = psiResult->lpVtbl->GetDisplayName(psiResult, SIGDN_FILESYSPATH,
&pszFilePath);
if (SUCCEEDED(hr))
{
*ReturnString = pszFilePath;
CoTaskMemFree(pszFilePath);
}
psiResult->lpVtbl->Release(psiResult);
}
}
MyDoccuments->lpVtbl->Release(MyDoccuments);
}
}
}
pfd->lpVtbl->Release(pfd);
}
}
LPCWSTR
是 Windows 乱码,又名“匈牙利表示法”,其中 LP 部分表示“长指针”。本质上是一个隐藏在 typedef
后面的指针,这是非常糟糕的做法,但它就是这样......
因此,这类似于声明
char*
(或 16 位等效项,可能是也可能不是 wchar_t
,具体取决于编译器)而不将其设置为指向任何位置。这是不行的——就像在基本 C 中一样,您需要将指针设置为指向分配的内存。声明一个数组并传递它。
更多信息在这里:https://learn.microsoft.com/en-us/windows/win32/learnwin32/working-with-strings
几乎所有 Win API 函数都采用指向调用者分配的缓冲区的指针以及大小,然后写入缓冲区,并可能告诉您通过另一个参数写入了多少字节。如果传递空指针,则会调用未定义的行为。