7
votes

L Préfixe pour chaînes en C ++

J'ai une bibliothèque statique. Cette bibliothèque a la fonction suivante définie xxx pré>

l'échantillon à appeler la fonction est p> xxx pré>

retour de l'écriture 0 sur le succès et -1 sur l'échec . P>

J'écris une DLL dynamique pour exporter cette fonction. P>

   LPTSTR s = (LPTSTR) L"Test Data"); //<= How can ii take input from user and 
    TestFun(s);  //OK  return 0


5 commentaires

Utiliser TCHAR a eu un sens il y a 10 ans. Plus, il n'y a pas de système d'exploitation non unicode que vous devez prendre en charge. Faire tout ce que wchar_t et passer à autre chose.


Qu'est-ce qui "ne fonctionne pas" lorsque vous passez LPDATA à la fonction Writedata?


Quelle fonction est réellement dans l'interface statique de la bibliothèque? Quelle partie sont vous écrit dans votre dll wrapper? Quelle interface attendez-vous à fournir?


La fonction lib renvoie 0 sur le succès et -1 sur l'échec. Je détarmine le succès et la défaillance mis en place sur la sortie de la fonction.


Comment pouvons-nous vous dire quel est le problème avec votre fonction si vous ne nous montrez pas la fonction?


5 Réponses :


7
votes

Le préfixe L rend la chaîne de chaîne wchar_t. Vous pouvez utiliser la fonction API Windows MultiByteTowIDechar Pour convertir une chaîne ANSI en une chaîne WCHAR_T.


3 commentaires

@Manjoor: Vous devriez vraiment expliquer pourquoi cela ne fonctionne pas. Ces gars-là essaient de vous aider sans frais pour vous et sans aucun avantage, et vous rejetez leurs efforts et que vous les faites sentir comme ils gaspillent leur temps, car vous êtes trop damné paresseux pour leur dire exactement pourquoi leur solution n'a pas 't fonctionne pour vous.


@Platinum azur je ne suis pas si paresseux :). J'ai dit que cela ne fonctionnait pas parce que cela ne fonctionnait pas. Prooblem a été résolu.


@Manjoor: Non, ce n'est pas assez bon ici. Si vous voulez que les gens passent du temps à faire votre travail sans que vous ne les payez, vous leur devez de décrire ce qui se passe exactement, quelle est votre production attendue, quelle est votre production réelle, surtout lorsque vous répondez à une réponse.



0
votes

Je voudrais envelopper vos chaînes dans le _t (...) macro. De cette façon, son portable entre ANSI et Unicode construit.

Notez que vous utilisez le type de chaîne portable - lttstr - Notez le t . Il changera entre ANSI et Unicode basé sur les paramètres de construction.


1 commentaires

Remarque: la macro _t est spécifique à Microsoft, pas générique C ++, comme LPTRSTR. Pas que soit difficile à réimplément.



6
votes

La "fonction" spécifique pour effectuer le préfixe L est une macro texte () code> ou _t () code>. (Le texte est défini par le SDK Windows, _T est une extension du runtime Microsoft C).

Ces fonctions ajoutent automatiquement le préfixe L lorsque votre projet est construit avec une assistance Unicode sur (qui est la valeur par défaut pour les nouveaux projets maintenant dans la plupart des MS Dev Environnements) - Ou laissez-le désactiver les projets configurés non Unicode (ou ANSI). P>

Ne faites pas cette distribution: p>

PCSTR p1 = "ABC";
PCWSTR p2 = L"ABC";
PCTSTR p3 = TEXT("ABC");


1 commentaires

Que diriez-vous de lui dire ce qui ne fonctionne pas au lieu de mettre le fardeau sur lui à deviner ??? Il prend du temps de sa journée pour répondre à votre question sans frais. Vous pouvez au moins lui donner quelques informations .



1
votes

Je pense que vous êtes confus, car votre fonction devrait fonctionner simplement bien:

Console::WriteLine(L"Hello World");


3 commentaires

Comme je l'ai mentionné dans ma question, cela va être dynamique dll. Cette DLL serait appelée à partir d'une application .NET. Il n'y a rien de tel que l préfixe dans .net


La fonction d'exportation DLL 'TestFun'. Pouvez-vous me donner une idée comment puis-je l'appeler d'une application C #? Ceci est dll-importer [dllimport ("test.dll")] privé statique externe int testfun (chaîne s);


Merci d'effort, mais je l'appelle de C # pour tester et il faut appeler à partir d'Easylangage pour que je ne puisse pas utiliser L.



1
votes

Essayez:

[DllImport("Test.dll")]
private static extern int TestFun([MarshalAs(UnmanagedType.LPTStr)] string s);


0 commentaires