繁体   English   中英

从C#到C-DLL调用/封送该结构时,为什么此字符串为空?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM