无法将 PathFindExtensionW 输出分配给 WCHAR 数组

标签 c winapi visual-studio-2012 console-application

我想将 PathFindExtensionW api 的输出分配给 WCHAR 数组。该 api 返回一个 LPWSTR 指针。我搜索了一下,发现将 LPWSTR 分配给 WCHAR 数组的方法如下:

WCHAR 数组[100] = PathFindExtensionW(,,,)

但它对我不起作用,我收到此错误:

表达式必须是可修改的左值

我使用的是VS 2012。我的代码如下:

#include <windows.h>
#include <iostream>
#include "Shlwapi.h"

#pragma comment(lib,"shlwapi.lib")

void main(int argc, char *argv[]){

    int iToSizeB = 0;
    iToSizeB = MultiByteToWideChar(CP_UTF8, 0, argv[1], -1 , NULL, 0);

    WCHAR lpFileAddress[260] = {0};
    MultiByteToWideChar(CP_UTF8, 0, argv[1], -1, lpFileAddress, iToSizeB);

    WCHAR lpDotPosition[260] = {0};

    //this line must be correct but I receive error
    lpDotPosition = PathFindExtensionW(lpFileAddress);

    int iToSizeW = 0;
    iToSizeW = WideCharToMultiByte(CP_UTF8, 0, lpDotPosition, -1, NULL, 0, NULL, NULL);

    CHAR lpExtension[260] = {0};
    WideCharToMultiByte(CP_UTF8, 0, lpDotPosition, -1, lpExtension, iToSizeW, NULL, NULL);

    printf("the format is:\n");
    printf(lpExtension);
    printf("\n");

    getchar();
}

这有什么问题吗?

感谢您的解决方案。

最佳答案

您不能通过向数组分配指针来填充数组。您必须复制数据,例如 lstrcpynW()或类似的功能:

LPCWSTR lpDotPosition = PathFindExtensionW(lpFileAddress);

WCHAR lpExtensionW[MAX_PATH] = {0};
lstrncpy(lpExtensionW, lpDotPosition, MAX_PATH);

但是,PathFindExtension() 只是返回您传入的字符串缓冲区内的指针,因此不需要分配扩展的单独副本,数据已经预先分配,只要输入字符串有效,返回的指针就保持有效:

#include <windows.h>
#include <iostream>
#include <Shlwapi.h>
#pragma comment(lib, "shlwapi.lib")

int main(int argc, char *argv[])
{
    WCHAR lpFileAddress[MAX_PATH] = {0};
    int iToSizeB = MultiByteToWideChar(CP_UTF8, 0, argv[1], -1, lpFileAddress, MAX_PATH);

    LPCWSTR lpDotPosition = PathFindExtensionW(lpFileAddress);

    CHAR lpExtension[MAX_PATH] = {0};
    int iToSizeW = WideCharToMultiByte(CP_UTF8, 0, lpDotPosition, -1, lpExtension, MAX_PATH, NULL, NULL);

    printf("the format is:\n%s\n", lpExtension);

    getchar();
    return 0;
}

另一方面,不需要仅使用 MultiByteToWideChar()WideCharToMultiByte() 来搜索 char 字符串,您可以可以使用 PathFindExtensionA() 代替:

#include <windows.h>
#include <iostream>
#include <Shlwapi.h>
#pragma comment(lib, "shlwapi.lib")

int main(int argc, char *argv[])
{
    LPCSTR lpExtension = PathFindExtensionA(argv[1]);

    printf("the format is:\n%s\n", lpExtension);

    getchar();
    return 0;
}

关于无法将 PathFindExtensionW 输出分配给 WCHAR 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51925674/

相关文章:

c - 没有监听时如何在套接字上发送消息?

c - 为什么将 hex int 转换为 char* 会向后打印?

winapi - 如果 CancelIo 失败怎么办?

c++ - libusb_hotplug_register_callback 不接受我的回调函数

c# - 当前上下文中不存在文本框(Gridview 和 TemplateField)

objective-c - 将指针分配给另一个指针会崩溃

c - 返回 C 中的字符串数组

c++ - 使用c++程序挂起系统

c++ - 禁用 ListView 中的项目变灰

unit-testing - 使用 NUnit 测试适配器进行单元测试失败,但使用 VS2012 中的 ReSharper 则不会