[英]Why is this String empty when invoking/marshaling this struct from C# to C-DLL?
我在C-DLL中定义了这样的功能:
int AcquireArchive (char* archiveName, Password* password)
DLL中将struct密码定义为:
typedef struct password {
unsigned char* pPwd;
unsigned long length;
} Password;
我正在做的是尝试使用以下方法在C#中包装此函数:
[DllImport("name.dll", CharSet = CharSet.Ansi, EntryPoint = "_AcquireArchive@16",
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;
}
我通过以下方式调用此函数:
Password password;
password.pwd = "password";
password.length = (ulong)password.pwd.Length;
int code = AcquireArchive("Archive", ref password);
现在的问题是,返回的代码将发出INVALID PASSWORD信号,表示(根据文档)密码长度为0。是否有可能在调用/编组过程中丢失password.pwd和/或password.length的值?
可悲的是,我无权访问dll的源代码。
编辑:CharSet现在是Ansi,TYPO“长度”,已删除[UnmanagedType.BStr]
我至少看到一个问题:
在您的C代码中(长度为32或64位,具体取决于DLL):
typedef struct {
unsigned char* pPwd;
unsigned long length;
} Password;
并在您的C#代码中(长度为64位):
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct Password
{
public string pwd;
public ulong length;
}
如果是64位,则可以。 但如果是32位,则应将C# ulong
更改为uint
如下所示:
public struct Password
{
public string pwd;
public uint length;
}
我希望这有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.