Ich werde übernächtigt versuchen herauszufinden, warum ich nicht eine externe Methode in einer alten C++ DLL aus meiner C# -Anwendung aufrufen kann.Schwierigkeit Aufruf unmanaged DLL aus C#
Hier ist der Funktionskopf:
int __export FAR PASCAL SimplePGPEncryptFile(
HWND hWnd1,
LPSTR InputFileName,
LPSTR OutputFileName,
BOOL SignIt,
BOOL Wipe,
BOOL Armor,
BOOL TextMode,
BOOL IDEAOnly,
BOOL UseUntrustedKeys,
LPSTR RecipientList,
LPSTR SignerKeyID,
int SignerBufferLen,
LPSTR SignerPassphrase,
int SignerPwdBufferLen,
LPSTR IDEAPassphrase,
int IDEAPwdBufferLen,
LPSTR PublicKeyRingName,
LPSTR PrivateKeyRingName);
meine C# Erklärung hier:
[DllImport("smplpgp_32.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int SimplePGPEncryptFile(
IntPtr hWnd1,
[MarshalAs(UnmanagedType.LPStr)] string InputFileName,
[MarshalAs(UnmanagedType.LPStr)] string OutputFileName,
bool SignIt,
bool Wipe,
bool Armor,
bool TextMode,
bool IDEAOnly,
bool UseUntrustedKeys,
[MarshalAs(UnmanagedType.LPStr)] string RecipientList,
[MarshalAs(UnmanagedType.LPStr)] string SignerKeyID,
int SignerBufferLen,
[MarshalAs(UnmanagedType.LPStr)] string SignerPassphrase,
int SignerPwdBufferLen,
[MarshalAs(UnmanagedType.LPStr)] string IDEAPassphrase,
int IDEAPwdBufferLen,
[MarshalAs(UnmanagedType.LPStr)] string PublicKeyRingName,
[MarshalAs(UnmanagedType.LPStr)] string PrivateKeyRingName);
Wenn ich diese Methode aufrufen, ich bin einer der beiden folgenden Fehler bekommen (im Header angegeben):
#define SIMPLEPGPENCRYPTFILE_RECIPIENTLISTDOESNOTENDWITHNEWLINE 408
#define SIMPLEPGPENCRYPTFILE_RECIPIENTLISTDOESNOTSTARTWITHGOODCODECHAR 409
Dies wird auch als konstante im Header definiert:
#define INCLUDE_ONLYUSERIDS 1
Dies ist C++ Code, der diese Funktion zu arbeiten bekannt ruft:
char recipients[512];
recipients[0] = INCLUDE_ONLYUSERIDS;
strcat(strcpy(&recipients[1], rID), "\n"); \\ rID is equal to "CA"
return 0 == SimplePGPEncryptFile(INI.m_hWnd,
(char*)plain, (char*)cipher,
0,
0,
1,
0,
0,
1, // UseUntrustedKeys
recipients,
0, 0,
0, 0,
0, 0,
PGPKM.pub, 0); //PGPKM.pub is declared earlier
diese Passing für den Parameter 'RecipientList' gibt mir die '409' Fehler:
string recipientList = "1CA\n\0";
Passing Dies für den 'RecipientList' Parameter gibt mir den '408' Fehler:
char[] recipients = new char[512];
recipients[0] = '1';
recipients[1] = 'C';
recipients[2] = 'A';
recipients[3] = '\n'; // also tried '\r', then '\n'
recipients[4] = Char.MinValue;
string paramValue = recipients.ToString();
Kann mir jemand ein offensichtliches Versehen vorwerfen? Ich fühle mich, als hätte ich alles, was ich brauche, um das zu lösen, aber nichts funktioniert wie erwartet.
Seitennotiz: Ich rufe erfolgreich eine andere Funktion in derselben .dll auf. Außerdem habe ich experimentiert, StringBuilder zu verwenden, um den RecipientList-Parameter zu erstellen.
Vielen Dank für Anregungen!
Empfänger [0] = INCLUDE_ONLYUSERIDS; - Verwandelt sich das nicht in Empfänger [0] = 1; was ist anders als Empfänger [0] = '1'; - das C# -Aquivalent wäre Empfänger [0] = (char) 1; – jeffora
Was ist der Zweck der Empfänger [4] = Char.MinValue ;? –
Im Code, der funktioniert, die Zeile strcat (strcpy (& recipient [1], rID), "\ n"): Wie sieht die resultierende Zeichenfolge aus, d. H. Wo wurde \ n kopiert? Nach 512 Bytes? Oder ist es schlau genug, jeden Teil der Empfänger [] zu kürzen? Schon eine Weile her, seit meinen C++ Tagen, verzeih mir –