LPCWSTR* 返回第一个字符不正确的字符串

问题描述 投票:0回答:1

在此代码中,我尝试将目录名称从公共项对话框传递到编辑控件的字符和结构。除了第一个字符之外,几乎所有字符都正确返回。第一个字符始终替换为随机字符或符号。我仍在学习 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);
    }

}

c string winapi
1个回答
0
投票

LPCWSTR
是 Windows 乱码,又名“匈牙利表示法”,其中 LP 部分表示“长指针”。本质上是一个隐藏在
typedef
后面的指针,这是非常糟糕的做法,但它就是这样......

因此,这类似于声明

char*
(或 16 位等效项,可能是也可能不是
wchar_t
,具体取决于编译器)而不将其设置为指向任何位置。这是不行的——就像在基本 C 中一样,您需要将指针设置为指向分配的内存。声明一个数组并传递它。

更多信息在这里:https://learn.microsoft.com/en-us/windows/win32/learnwin32/working-with-strings

几乎所有 Win API 函数都采用指向调用者分配的缓冲区的指针以及大小,然后写入缓冲区,并可能告诉您通过另一个参数写入了多少字节。如果传递空指针,则会调用未定义的行为。

© www.soinside.com 2019 - 2024. All rights reserved.