2010-11-03 8 views
7

Ich habe eine statische Bibliothek. Diese Bibliothek hat die folgende FunktionL Präfix für Zeichenfolgen in C++

definiert
int WriteData(LPTSTR s) 

Die Probe um die Funktion aufzurufen ist

LPTSTR s = (LPTSTR) L"Test Data"; 
int n = WriteData(s); 

0 bei Erfolg und -1 bei einem Fehler zurückkehren Writedata.

Ich schreibe eine dynamische DLL, um diese Funktion zu exportieren.

int TestFun(LPTSTR lpData) 
{ 
    return WriteData(lpData); 
} 

A C++ Testanwendung Ergebnis

LPTSTR s = (LPTSTR) L"Test Data"; 
TestFun(s); //OK return 0 

LPTSTR s = (LPTSTR) "Test Data";  
TestFun(s); //Fail return -1 

Ich habe es aus C# Anwendung aufzurufen. Ich gehe davon aus meiner DLL-Import Unterschrift wäre:

 [DllImport("Test.dll")] 
     private static extern int TestFun(String s); 

Meine Frage ist sehr einfach wie kann ich es von Net nennen? Wie Sie sehen, ich habe die Kontrolle über

TestFun(LPTSTR lpData) 

aber keine Kontrolle über

WriteData(LPTSTR s) 

Vielen Dank allen für ihren Einsatz. Bis jetzt bin ich beim Casting fest. Ich denke, dass mein Problem gelöst werden würde, wenn ich in der Lage sein könnte, die Eingabe vom Benutzer zu nehmen und 2 Zeilen für das Casting anstelle der folgenden Zeile zu schreiben.

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

Die Verwendung von TCHAR hat vor 10 Jahren Sinn ergeben. Nicht mehr, es gibt kein Nicht-Unicode-Betriebssystem, das Sie unterstützen müssen. Mache alles wchar_t und gehe weiter. –

+0

Wie kann ich das tun? – Manjoor

+0

Was funktioniert nicht, wenn Sie lpData an die WriteData-Funktion übergeben? – harper

Antwort

7

Das L-Präfix macht die Zeichenfolge zu einer wchar_t-Zeichenfolge. Sie können die Windows-API-Funktion MultiByteToWideChar verwenden, um eine ANSI-Zeichenfolge in eine wchar_t-Zeichenfolge zu konvertieren.

+0

Es funktioniert nicht in meinem Fall – Manjoor

+1

Wie funktioniert es nicht? –

+6

@Manjoor: Sie sollten wirklich erklären, warum es nicht funktioniert. Diese Leute versuchen dir kostenlos und ohne Nutzen für sie zu helfen, und du lehnst ihre Bemühungen ab und lässt sie das Gefühl haben, dass sie ihre Zeit verschwenden, weil du zu faul bist ihnen genau zu sagen, warum ihre Lösung nicht funktioniert Ich arbeite nicht für dich. –

0

Ich würde Ihre Zeichenfolgen in die _T(...) Makro wickeln. Auf diese Weise ist es tragbar zwischen ANSI und UNICODE Builds.

Beachten Sie, dass Sie den tragbaren String-Typ verwenden - LPTSTR - beachten Sie die T. Es wird basierend auf den Build-Einstellungen zwischen ANSI und UNICODE wechseln.

+0

Hinweis: Das '_T'-Makro ist Microsoft-spezifisch, nicht generisches C++, wie LPTSTR. Nicht dass es schwer ist, sie neu zu implementieren. –

6

Die spezifische "Funktion" zur Ausführung des Präfix L ist ein Makro TEXT() oder _T(). (TEXT wird vom Windows SDK definiert, _T ist eine Erweiterung der Microsoft C Runtime).

Diese Funktionen fügen das L-Präfix automatisch hinzu, wenn Ihr Projekt mit Unicode-Unterstützung erstellt wird (dies ist der Standard für neue Projekte in den meisten MS Dev-Umgebungen) - oder lassen Sie es für nicht Unicode (oder ansi) konfigurierte Projekte aus.

Sie diese Besetzung nicht tun:

LPTSTR s = (LPTSTR) L"ABC"; // Working fine 
    WriteData(s); 

Wenn das Projekt jemals für nicht Unicode konfiguriert wurde, dann L „ABC“ noch eine Reihe von weit Zeichen wäre, aber LPTSTR würde ein Zeiger werden ein Array von 8-Bit-Zeichen.

So weisen Sie einer Ansi -, Unicode - oder "Text" - Zeichenfolge eine Zeichenfolge richtig zu.(Text kann abhängig von den Projekteinstellungen Ansi oder Unicode sein) (Ich habe das L weggelassen, weil es redundant ist, und ein C hinzugefügt, weil String-Literale konstant sein sollten).

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

Danke für Ihre Antwort, aber es löst nicht mein Problem. – Manjoor

+5

Wie wäre es, wenn Sie ihm sagen, was nicht funktioniert, anstatt ihn zu belasten? Er nimmt sich die Zeit, um Ihre Frage kostenlos zu beantworten. Sie könnten ihm zumindest einige Informationen geben. –

1

Ich glaube, Sie sind verwirrt, wie Ihre Funktion sollte gut funktionieren:

int TestFun(LPTSTR lpData) 
{ 
    return WriteData(lpData); // Should be happy 
} 

Aber wenn man Anruf Ihre Funktion, Sie müssen vorsichtig sein:

TestFun((LPTSTR) L"ABC"); // Will work fine 
TestFun((LPTSTR) "ABC"); // Will not work 

Dies ist, weil "ABC" und L "ABC" zwei verschiedene Dinge sind. Wenn man sie in Erinnerung aussehen:

"ABC" | 65 66 67 00 
L"ABC" | 65 00 66 00 67 00 00 00 

Edited hinzufügen:

Es gibt nichts wie L-Präfix in .Net

Dies ist einfach falsch. Ich öffnete nur "New Project-> C++ -> CLR Console" in Visual Studio, und die erste Zeile ist:

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

Wie ich in meiner Frage erwähnt habe, wird dies dynamische DLL sein. Diese DLL würde von einer .Net-Anwendung aufgerufen werden. Es gibt nichts wie L Präfix in .Net – Manjoor

+0

Die DLL Export-Funktion 'TestFun'. Können Sie mir eine Idee geben, wie kann ich es aus einer C# -Anwendung aufrufen? Dies ist dll-import [DllImport ("Test.dll ")] private statisch extern int TestFun (String s); – Manjoor

+0

Danke für die Mühe, aber ich rufe es von C# zum Testen und es muss von easylanguage aufgerufen werden, damit ich nicht L. verwenden kann – Manjoor

1

Versuchen:

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

Weitere Informationen über auf MSDN mit dem MarshalAsAttribute Marshalling.