私はC-DLLで定義されている。このような機能を持って:私は何をやっていることで、この機能をラップしようとしているC#からC-DLLにこの構造体を呼び出す/マーシャリングするときに、この文字列が空であるのはなぜですか?
typedef struct password {
unsigned char* pPwd;
unsigned long length;
} Password;
:構造体のパスワードは次のようにDLLで定義されている
int AcquireArchive (char* archiveName, Password* password)
をC#の使用:
[DllImport("name.dll", CharSet = CharSet.Ansi, EntryPoint = "[email protected]",
CallingConvention = CallingConvention.StdCall)]
public static extern int AcquireArchive(
[MarshalAs(UnmanagedType.LPStr)] string archiveName,
ref Password password
);
と:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct Password
{
public string pwd;
public ulong length;
}
を3210
Iにより、この関数をコールします。今問題は(マニュアルに従って)0 のパスワード長さを示すことは可能それパスワードの値は、返されたコード信号無効なパスワードということである
Password password;
password.pwd = "password";
password.length = (ulong)password.pwd.Length;
int code = AcquireArchive("Archive", ref password);
.pwdおよび/またはpassword.lengthは呼び出し/マーシャリングプロセスで失われますか?
悲しいことに、私はdllのソースコードにアクセスできません。
EDIT:文字セットが[UnmanagedType.BStr】除去、今ANSI、TYPO "長さ" である
C++コードはUnicodeを使用していますか? 'CharSet.Auto'はWIndows XP以降でも同様です。 –
UnmanagedType.BStrではありません。削除してください。 CharSet.Auto構造体が間違っている、あなたはCharSet.Ansiを使用する必要があります。 –
私はここにエラーがあると思います:password.lenght <----- "lenght"を修正する必要があります – Mimouni