'System :: String ^' в 'LPCWSTR'

Я хочу конвертироватьSystem::String ^ вLPCWSTR.

за

FindFirstFile(LPCWSTR,WIN32_FIND_DATA); 

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

 heavyd30 июн. 2009 г., 12:47
Какой язык ты используешь?
 Rick204727 июл. 2009 г., 09:23
m использую vc ++ .. только что потерял трек кода, поэтому .. нужно время, чтобы использовать ответы.

Ответы на вопрос(4)

http: //www.pinvoke.net/default.aspx/kernel32/FindFirstFile.htm

Просто добавьтеDllImport подпись собственной функции:

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

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

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

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

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

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

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

Самый простой способ сделать это в C ++ / 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);
}
 Eugene Beresovsky31 янв. 2019 г., 02:28
Следует отметить, чтоwname указывает на фактические символьные данные вs, а не его копию, что может сделать его более эффективным, чем другие решения маршалинга. const намекает на это)

: String из LPCWSTR в C ++ / 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);

Ваш ответ на вопрос