10
votes

'Système :: String ^' à 'LPCWSTR'

Je veux convertir le système System :: string ^ à lpcwstr .

pour xxx

aide .


1 commentaires

m Utilisation de VC ++ .. vient de perdre la piste de code, donc .. Besoin de temps pour utiliser les réponses.


4 Réponses :


2
votes

Vous devez utiliser p / invoke. Vérifiez ce lien: http://www.pinvoke.net/default.aspx/ kernel32 / windfirstfile.html

ajoutez simplement le dllimport Signature de la fonction native: xxx

et CLR sera géré au type natif Marshaling automatiquement.

[modifier] Je viens de réaliser que vous utilisez c ++ / cli. Dans ce cas, vous pouvez également utiliser implicite p / invoquer , qui est une caractéristique que seul C ++ prend en charge (opposé à C # et VB.NET). Ces articles affichent plusieurs exemples:

Comment: convertir entre Divers types de chaînes en C ++ / CLI


0 commentaires

11
votes

Pour convertir un système :: String OT LPCWSTR en C ++ / CLI Vous pouvez utiliser le marshal :: stringtohglobalansi fonction Pour convertir des chaînes gérées en chaînes non exploitées.

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 commentaires

25
votes

Le moyen le plus simple de le faire en C ++ / CLI est d'utiliser PIN_PTR CODE>:

#include <vcclr.h>

void CallFindFirstFile(System::String^ s)
{
    WIN32_FIND_DATA data;
    pin_ptr<const wchar_t> wname = PtrToStringChars(s);
    FindFirstFile(wname, &data);
}


1 commentaires

Il convient de noter que le wwname indique les données de caractère réelles dans s , pas une copie de ceux-ci, ce qui peut le rendre plus efficace que les autres solutions de maréchalation. ( const allusion à cela)



0
votes

J'ai trouvé que xxx pré>

ne fonctionne pas, le code de renvoi 87. Au lieu de cela, P>

#include <atlstr.h>

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


0 commentaires