gpt4 book ai didi

c# - Dll 导入编码(marshal) C++ 字符串问题

转载 作者:行者123 更新时间:2023-11-28 07:13:58 25 4
gpt4 key购买 nike

这是我要导入的 DLL 函数的签名

typedef char*(*DLLFUNC_Encrypt)(const char*, unsigned int, unsigned int&);

这是我的C#代码

[DllImport("AuthCrypto.dll", EntryPoint = "Encrypt")]
public static extern IntPtr Encrypt(IntPtr data, int size, ref int mode);

public static string EncryptData(string data)
{
int mode = 5;
IntPtr dataIntPtr = Marshal.StringToHGlobalAnsi(data);
IntPtr data_enc = CryptoAPI.Encrypt(dataIntPtr, data.Length, ref mode);

return Marshal.PtrToStringAnsi(data_enc);
}

这是我的异常(exception)情况:

A call to PInvoke function 'CryptoAPI::Encrypt' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.

最佳答案

看起来您需要指定要使用的调用约定。由于在 DLLFUNC_Encrypt 上没有明确设置,编译器使用其默认值。哪个调用约定被视为默认调用约定取决于您的编译器设置(对于 Visual Studio,如果您未更改它,则为 cdecl)。

您可以通过显式指定调用约定 DLLFUNC_Encrypt 来解决这个问题,如下所示:

typedef char*(*__cdecl DLLFUNC_Encrypt)(const char*, unsigned int, unsigned int&);

并相应地调整您的平台调用:

[DllImport("AuthCrypto.dll", EntryPoint = "Encrypt", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr Encrypt(IntPtr data, int size, ref int mode);

您可以传递给 DllImport 的调用约定在 CallingConvention enumeration 中定义.


我刚刚了解到您正在调用的 DLL 是封闭源代码。如果您不能在 DLL 中指定调用约定,您可以查看是否在其文档中找到该库使用的调用约定,或者您可以只进行测试直到找到一个有效的调用约定(它可能是 StdCallCdecl)。

关于c# - Dll 导入编码(marshal) C++ 字符串问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20530651/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com