'System:: String ^' в 'LPCWSTR'

Я хочу преобразовать System::String ^ в LPCWSTR.

для

FindFirstFile(LPCWSTR,WIN32_FIND_DATA); 

Пожалуйста, помогите.

Ответ 1

Самый простой способ сделать это в С++/CLI - использовать 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);
}

Ответ 2

Чтобы преобразовать System:: String из LPCWSTR в С++/CLI, вы можете использовать функцию Marshal:: StringToHGlobalAnsi для преобразования управляемых строк в неуправляемые строки.

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);

Ответ 3

Вам нужно использовать P/Invoke. Проверьте эту ссылку: http://www.pinvoke.net/default.aspx/kernel32/FindFirstFile.html

Просто добавьте встроенную подпись DllImport:

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

и CLR автоматически выполнит автоматическое марксирование типа.

[Изменить] Я просто понял, что вы используете С++/CLI. В этом случае вы также можете использовать неявный P/Invoke, который является функцией, поддерживаемой только С++ (против С# и VB.NET), В этих статьях приведены несколько примеров:

Как преобразовать различные типы строк в С++/CLI

Ответ 4

Я обнаружил, что

String^ str = "C:\\my.dll";

::LoadLibraryEx(LPCWSTR)Marshal::StringToHGlobalAnsi(str).ToPointer(), 0, flags); 

не работает, возвращая код 87. Вместо этого

#include <atlstr.h>

CString s("C:\\my.dll");
::LoadLibraryEx((LPCWSTR)s, 0, flags);

работает как шарм и, кажется, является наименьшим многословным методом.