2014-01-27 6 views
5

zurückgeben Ich habe eine native C++ (ich denke) App, die konfiguriert werden kann, um eine bestimmte DLL laden und eine Funktion aufrufen. Diese Funktion gibt int zurück, nimmt vier Parameter auf, sollte mindestens eines der beiden ändern und einen Wert zurückgeben. Laut Handbuch soll diese Funktion in C++ definiert werden als:Export verwaltete C# -Funktion, um geänderte char * -Parameter zu unmanaged Code

__declspec(dllexport) int funcName(const char* par1, const char* par2, char* par3, char* par4); 

jedoch durch die Nachfrage, sollte diese Funktion in C# implementiert werden. Ich bin mit Unmanaged Exporte mir zu erlauben, zu verwenden:

[DllExport("funcName", CallingConvention.Cdecl)] 
public static unsafe int funcName(string par1, string par2, string par3, string par4) { 
    // sample for par3 only when using StringBuilder instead of string 
    // but is similar with other types 
    par3 = new StringBuilder(256); 
    par3.Append("12345"); 
    return 0; 
} 

Parameter 1 und 2 gut funktionieren (ich kann die Werte messagebox erhalten), aber ich habe versucht, (mindestens) die folgenden als die 3. und 4. Parameter :

char* => 
=> string 
=> StringBuilder 
=> char[] 

alle diese mit [In], [Out], [In,Out], out, ref.

Funktion sollte den Wert von Par3 und Par4 ändern und eine Ganzzahl zurück an die aufrufende Anwendung zurückgeben. Die Anwendung liest den Wert von par3 (es handelt sich tatsächlich um eine Ganzzahl, die als Zeichenfolge dargestellt wird) und schreibt sie in die Protokolldatei. Nach dem Überprüfen der Protokolldatei ist der Wert nicht der in funcName (...) festgelegte Wert.

Am häufigsten ist der Wert „“ (leer), jedoch nur bei Verwendung von char[] mit out oder ref scheint es wieder ein Wert übergeben werden, aber es ist nur ein paar seltsamen Zeichen (nicht den Wert, der in funcName gesetzt).

So wäre die Frage, wie Char * Parameter beim Aufruf einer verwalteten DLL-Funktion aus nicht verwalteten Code zurückgegeben werden?

+0

Sind Par3- und Par4-Zeichenzeiger Zeichenfolgen oder empfangen sie Adressen für einzelne Zeichen? –

+0

Müssen Sie den Zeichensatz nicht einstellen, sonst werden sie 'wchar_t *'? –

+0

@ ta.speot.is Nein. Der Standardwert ist ANSI. –

Antwort

3

Ich bezweifle sehr, dass UnmanagedImports die Arbeit für Sie erledigen wird. Es wird keine Magie StringBuilder in Existenz, wenn ich mich sehr irre. Ich glaube, Sie es so codieren müssen:

[DllExport("funcName", CallingConvention.Cdecl)] 
public static int funcName(string par1, string par2, IntPtr par3, IntPtr par4) 
{ 
    string inputStr = Marshal.PtrToStringAnsi(par3); 
    string outputStr = "foo\0"; 
    byte[] outputBytes = Encoding.Default.GetBytes(outputStr); 
    Marshal.Copy(outputBytes, 0, par3, outputBytes.Length); 
    return 0; 
} 

Bitte beachte, dass ich die unsafe entfernt haben, da dies nicht notwendig ist.

+0

Es tut mir leid, dass Sie Ihre Frage komplett falsch verstanden haben. Ich hoffe, ich habe dieses Mal besser gemacht. –

+1

DANKE! Ich habe seit fast einer Woche so viele verschiedene ähnliche Fragen für diese Antwort untersucht. Ich wünschte, ich hätte im Moment einen größeren Ruf, also könnte ich diese Lösung verbessern, weil sie die erste ist, die funktioniert. Danke nochmal! –