将字符串解析为LPCWSTR

时间:2013-12-17 09:12:12

标签: c++ winapi boost boost-filesystem

我正在使用boost-filesystem来搜索具体路径中的所有文件。 我还想检索此文件的创建数据,上次打开和上次更新,以便我在Windows中工作时我需要使用 GetFileTime (这需要 HANDLE 我会通过 CreateFile 功能获取。

重点是通过boost文件系统,我得到一个字符串,如

  

string filename =“C:\ Users \ MyUser \ Desktop \ PDN.pdf”;

我需要将此字符串转换为LPCWSTR。

因此我做了几次尝试都失败了,例如:

HANDLE hFile = CreateFile((LPCWSTR)fileName.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL);

但是当这样做时,它成功了:

HANDLE hFile = CreateFile(L"C:\\Users\\MyUSer\\Desktop\\PDN.pdf", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL);

所以我的问题是,如何使用字符串变量将字符串解析为PWSTR? 如果可能的话(我猜不是),是否有任何函数可以改变原始路径添加斜杠,找到另一个斜杠?

非常感谢

EDITED: 这是我在这里阅读之后的方式:

  

wstring fileFullPathWstring =   winAPII.stringToWstring(iter->路径()字符串());

     

HANDLE hFile = CreateFile(fileFullPathWstring.c_str(),GENERIC_READ,   FILE_SHARE_READ,NULL,OPEN_EXISTING,NULL,NULL);

使用该功能:

wstring WinAPIIteraction::stringToWstring(string stringName){
    int len;
    int slength = (int)stringName.length() + 1;
    len = MultiByteToWideChar(CP_ACP, 0, stringName.c_str(), slength, 0, 0);
    wchar_t* buf = new wchar_t[len];
    MultiByteToWideChar(CP_ACP, 0, stringName.c_str(), slength, buf, len);
    std::wstring r(buf);
    delete[] buf;
    return r;
}

4 个答案:

答案 0 :(得分:5)

您可以使用MultibyteToWideChar()功能执行实际转换(MSDN page)。无需添加斜杠 - 它们只是表示程序代码中单个'\'的转义序列。

答案 1 :(得分:1)

最简单的解决方案:

wstring filename="C:\Users\MyUser\Desktop\PDN.pdf";
HANDLE hFile = CreateFile(
    fileName.c_str(), // std::wstring::c_str returns wchar_t*
    GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL);

答案 2 :(得分:1)

使用ATL的CA2W

string filename="C:\Users\MyUser\Desktop\PDN.pdf";
HANDLE hFile = CreateFile(CA2W(fileName.c_str()), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL);

答案 3 :(得分:0)

我知道这已经晚了但这是我用来将字符串转换为LPCWSTR的方法:

@FunctionalInterface
public interface VerificationStrategy {
    void verify(Foo foo) throws Exception;
}

@Configuration
public class VerificationConfiguration {
    @Bean
    public VerificationStrategy strategy1() {
        return (foo) -> {System.out.println(foo);};
    }

    @Bean
    public VerificationStrategy strategy2() {
        return (foo) -> {System.out.println(foo);};
    }
}    

@Component
public class B {
    @Autowired
    public B(@Qualifier("strategy1") VerificationStrategy a) {}
}

@Component
public class C {
    @Autowired
    public C(@Qualifier("strategy2") VerificationStrategy a) {}
}