Hallo,
ich habe in eine Delphi-DLL eine Funktion die so aussieht:
Delphi-Quelltext
1:
| function foo(pcResultBuffer: pchar; iResultBufferSize: integer): integer; stdcall; |
In pcResultBuffer wird ein String zurückgegeben. iResultBufferSize teilt die Größe des Buffers mit, auf den pcResultBuffer zeigt.
Diese möchte ich unter C# verwenden.
Ich importiere die DLL dynamisch. Also lege ich einen Typ an
(Ist das so richtig?):
C#-Quelltext
1: 2:
| [UnmanagedFunctionPointer(CallingConvention.StdCall)] private delegate int FooCallbackType([MarshalAs(UnmanagedType.LPStr)] string resultBuffer, int resultBufferSize); |
... der dann verwendet wird
C#-Quelltext
1:
| private FooCallbackType fooCallback = null; |
Das Auslesen der Funktionszeiger:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| private void GetProcAddresses() { IntPtr funcAddr = IntPtr.Zero; funcAddr = GetProcAddress(dllHandle, "foo"); if (funcAddr != IntPtr.Zero) fooCallback = (FooCallbackType)Marshal.GetDelegateForFunctionPointer( funcAddr, typeof(FooCallbackType)); } |
Jetzt fehlt noch der Aufruf der Funktion. Wie mache ich das? Genauer: Wie initialisiere ich den Buffer auf eine bestimmte Länge, damit die Delphi-Funktion was hineinschreiben kann?
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| string resultBuffer; int bufferSize; int charsInBuffed;
charsInBuffed = foo(resultBuffer, bufferSize); |
Oder muss man das ganz anders machen?