2009-06-30 4 views
10

Je souhaite convertir System::String ^ en LPCWSTR.'System :: String ^' à 'LPCWSTR'

pour

FindFirstFile(LPCWSTR,WIN32_FIND_DATA); 

S'il vous plaît aider.

+0

Quelle langue utilisez-vous? – heavyd

+0

m en utilisant vC++ .. juste perdu le code de suivi, donc .. besoin de temps pour utiliser les réponses. – Rick2047

Répondre

2

Vous devez utiliser P/Invoke. Vérifiez ce lien: http://www.pinvoke.net/default.aspx/kernel32/FindFirstFile.html

ajouter simplement la signature de la fonction native DllImport:

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

et CLR ne réussi à type natif marshaling automatiquement.

[Éditer] Je viens de réaliser que vous utilisez C++/CLI. Dans ce cas, vous pouvez également utiliser implicit P/Invoke, qui est une fonctionnalité prise en charge uniquement par C++ (par opposition à C# et VB.NET). Cet article montre plusieurs exemples:

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

10

Pour convertir un système :: chaîne ot LPCWSTR en C++/CLI vous pouvez utiliser la fonction Marshal::StringToHGlobalAnsi pour convertir des chaînes en chaînes non gérés gérés.

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

La meilleure façon de le faire en C++/CLI est d'utiliser 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

J'ai trouvé que

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

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

ne fonctionne pas, le code de retour 87. Au lieu de cela,

#include <atlstr.h> 

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

a fonctionné comme un charme et semble être la méthode la moins verbeuse.