PInvoke 期间的访问冲突

发布于 2025-01-02 16:47:57 字数 898 浏览 0 评论 0原文

我有这个 dll 调用:

 [DllImport("FreqCntPcIntf.dll", CallingConvention = CallingConvention.StdCall)]
    public static extern Intf_ErrorType FreqCntIntf_Init(
        ref byte InstNo, 
        string InstName, 
        string PortServerName, 
        ulong UartComPort, 
        ulong MaxBlockTime);

enum Intf_ErrorType
{
    ...
}

C++ 声明是这样的:

FREQCNTINTF_API Intf_ErrorType STDCALL FreqCntIntf_Init(InstanceNoType* InstNo, const char* InstName, const char* PortServerName, rsuint32 UartComPort, rsuint32 MaxBlockTime); 

其中:

typedef enum 
{
   ....
}  RSENUM8(Intf_ErrorType);

#define FREQCNTINTF_API __declspec(dllexport)
typedef rsuint8 InstanceNoType;
typedef unsigned char rsuint8;
#define RSENUM32(EnumName)  Enum_##EnumName; typedef rsuint32 EnumName

我在调用期间收到 AccessViolation。我应该在哪里寻找错误?

I have this dll call:

 [DllImport("FreqCntPcIntf.dll", CallingConvention = CallingConvention.StdCall)]
    public static extern Intf_ErrorType FreqCntIntf_Init(
        ref byte InstNo, 
        string InstName, 
        string PortServerName, 
        ulong UartComPort, 
        ulong MaxBlockTime);

enum Intf_ErrorType
{
    ...
}

And the C++ declaration is this:

FREQCNTINTF_API Intf_ErrorType STDCALL FreqCntIntf_Init(InstanceNoType* InstNo, const char* InstName, const char* PortServerName, rsuint32 UartComPort, rsuint32 MaxBlockTime); 

where:

typedef enum 
{
   ....
}  RSENUM8(Intf_ErrorType);

#define FREQCNTINTF_API __declspec(dllexport)
typedef rsuint8 InstanceNoType;
typedef unsigned char rsuint8;
#define RSENUM32(EnumName)  Enum_##EnumName; typedef rsuint32 EnumName

I receive AccessViolation during call. Where should I look to find the bug?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

獨角戲 2025-01-09 16:47:57

rsuint32 应表示为 uint(4 字节宽),而不是 ulong(在 C# 中为 8 字节长)。另外,您可能想通过指定 CharSet 来确保您的字符串已正确编组,如下所示:

[DllImport("FreqCntPcIntf.dll", CallingConvention = CallingConvention.StdCall, CharSet=CharSet.Ansi)]

rsuint32 should be expressed as uint, which is 4-byte wide, not ulong, which in C# is 8 byte long. Also, you might want to make sure, that your strings are marshalled proplery, by specifying CharSet, like this:

[DllImport("FreqCntPcIntf.dll", CallingConvention = CallingConvention.StdCall, CharSet=CharSet.Ansi)]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文