'System::String ^' to 'LPCWSTR'

前端 未结 4 2076
囚心锁ツ
囚心锁ツ 2020-12-17 19:45

I want to convert System::String ^ to LPCWSTR.

for

FindFirstFile(LPCWSTR,WIN32_FIND_DATA); 

Please help.

相关标签:
4条回答
  • 2020-12-17 20:25

    To convert a System::String ot LPCWSTR in C++/CLI you can you use the Marshal::StringToHGlobalAnsi function to convert managed strings to unmanaged strings.

    System::String ^str = "Hello World";
    
    IntPtr ptr = System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(str);
    
    HANDLE hFind = FindFirstFile((LPCSTR)ptr.ToPointer(), data);
    
    System::Runtime::InteropServices::Marshal::FreeHGlobal(ptr);
    
    0 讨论(0)
  • 2020-12-17 20:38

    I have found that

    String^ str = "C:\\my.dll";
    
    ::LoadLibraryEx(LPCWSTR)Marshal::StringToHGlobalAnsi(str).ToPointer(), 0, flags); 
    

    does not work, returning code 87. Instead,

    #include <atlstr.h>
    
    CString s("C:\\my.dll");
    ::LoadLibraryEx((LPCWSTR)s, 0, flags);
    

    has been working like a charm and seems to be the least verbose method.

    0 讨论(0)
  • 2020-12-17 20:41

    You need to use P/Invoke. Check this link: http://www.pinvoke.net/default.aspx/kernel32/FindFirstFile.html

    Simply add the DllImport native function signature:

     [DllImport("kernel32.dll", CharSet=CharSet.Auto)]
     static extern IntPtr FindFirstFile
         (string lpFileName, out WIN32_FIND_DATA lpFindFileData);
    

    and CLR will do managed to native type marshaling automatically.

    [Edit] I just realized you're using C++/CLI. In that case, you can also use implicit P/Invoke, which is a feature which only C++ supports (opposed to C# and VB.NET). This articles shows several examples:

    How to: Convert Between Various String Types in C++/CLI

    0 讨论(0)
  • 2020-12-17 20:43

    The easiest way to do this in C++/CLI is to use pin_ptr:

    #include <vcclr.h>
    
    void CallFindFirstFile(System::String^ s)
    {
        WIN32_FIND_DATA data;
        pin_ptr<const wchar_t> wname = PtrToStringChars(s);
        FindFirstFile(wname, &data);
    }
    
    0 讨论(0)
提交回复
热议问题