0 0

C#调用C++的DLL传结构体指针参数,尝试读取或写入受保护的内存,这通常指示其他内存已损坏。怎么解决啊25

C++结构体
typedef struct tagtmcp_login_info
{
    int ip_type;
    int user_id;
    int error_code;
    int control_uint_id;
    int privilege_code_size;
    int* privilege_code_array;
    char session_id[128];
    bool login_result;
    int userRightLevel;
 
    tagtmcp_login_info()
    {
        privilege_code_array = NULL;
        login_result = false;
    }
 
    ~tagtmcp_login_info()
    {
        if(privilege_code_array)
            delete [] privilege_code_array;
    }
 
}tmcp_login_info, *ptmcp_login_info;

C#结构体
[StructLayout(LayoutKind.Sequential)]
    public struct tmcp_login_info
    {
        public int ip_type;
        public int user_id;
        public int error_code;
        public int control_uint_id;
        public int privilege_code_size;
        public int[] privilege_code_array;
        public string session_id;
        public bool login_result;
        public int userRightLevel;
    }

C++函数定义
TMCP_INTERFACE_SDK_API(int) tmcp_login_cms(const char* user_name, 
                                           const char* password, 
                                           tmcp_enum_login_types login_type, 
                                           ptmcp_login_info plogin_info,
                                           const char* end_point_url,
                                           const char* local_ip = NULL);

C#调用
[DllImport("tmcp_interface_sdk.dll", EntryPoint = "tmcp_login_cms", ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
        private extern static int tmcp_login_cms(string user_name, string password, int login_type, IntPtr plogin_info, string end_point_url, string local_ip);
 
        public static int call_tmcp_login_cms(string user_name, string password, int login_type, ref tmcp_login_info info, string end_point_url, string local_ip)
        {
            Type type = info.GetType();
            int size = Marshal.SizeOf(type);
            IntPtr pBuff = Marshal.AllocHGlobal(size);
            int ret = tmcp_login_cms(user_name, password, login_type, pBuff, end_point_url, local_ip);
            IntPtr ptr = new IntPtr(pBuff.ToInt64() + size);
            Marshal.FreeHGlobal(pBuff);
            tmcp_login_info plogin_info = (tmcp_login_info)Marshal.PtrToStructure(ptr, type);/*这行代码报错*/
            return ret;
        }
 
调用代码:
tmcp_login_info info = new tmcp_login_info();  
call_tmcp_login_cms("admin", "12345", 0, ref info, "", "");

出错信息:
“System.AccessViolationException”类型的未经处理的异常出现在 mscorlib.dll 中。
其他信息: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
2014年9月19日 10:26

1个答案 按时间排序 按投票排序

0 0

楼主您好,我也遇到一样问题,您怎么解决的呢?

2018年3月23日 09:42

相关推荐

    关于 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。的解决方法

    在编程和软件开发过程中,有时会遇到“尝试读取或写入受保护的内存”的错误,这通常是由于内存管理问题导致的。此错误表明程序试图访问的内存区域可能已被操作系统标记为不可读或不可写,这往往暗示着内存损坏或其他...

    C#调用C++ Dll关于结构体数组引用的传递及解析使用的展示代码

    ### C#调用C++ DLL:结构体数组引用的传递及解析使用详解 #### 引言 在跨语言编程环境中,经常会遇到不同编程语言之间进行交互的需求。C#与C++之间的互操作就是一个典型场景。当C#需要调用C++开发的动态链接库...

    c++调用dll ,指针结构体参数传递

    c++调用dll ,指针结构体参数传递,--改造了csdn 上的一个程序。

    C#调用C++生成的DLL,并返回结构体引用或者结构体指针多个值

    总结,C#调用C++生成的DLL返回结构体引用或指针,主要涉及结构体的定义、`DllImport`特性的使用、内存管理和错误处理。通过正确的映射和转换,可以无缝地在C#和C++之间传递结构体数据,实现跨语言的高效协作。

    C# 调用C++DLL(函数参数包含指针)

    总结来说,C#调用C++DLL并处理指针参数涉及到P/Invoke、函数原型声明、指针类型映射、内存管理和异常处理等多个环节。理解这些细节是成功进行跨语言互操作的关键。在实际开发中,务必确保所有操作都遵循安全规范,以...

    基于C#调用c++Dll结构体数组指针的问题详解

    基于C#调用C++ Dll结构体数组指针的问题详解 C#调用C++ Dll文件是一件很麻烦的事情,首先面临的是数据类型转换的问题。相信经常做C#开发的都和我一样把学校的那点C++基础都忘光了吧(语言特性类)。网上有一大堆得...

    C#调用C++DLL传递结构体数组的终极解决方案

    【C#调用C++DLL传递结构体数组的终极解决方案】 在C#和C++混合编程中,常常需要跨语言调用DLL中的函数,而结构体数组是常见的数据传输对象。由于C#和C++对内存管理的方式不同,直接传递结构体数组可能会遇到问题。...

    C#调用C++封装成DLL的结构体及类库.rar

    当C#调用C++ DLL时,需要确保结构体的内存布局与C++相同,包括对齐方式和成员顺序,因为这直接影响到数据传输的正确性。 3. **类库(Class Library)**:C++类库可能包含多个类和接口,这些可以封装在DLL中供C#使用...

    C#调用C++动态库,执行回调函数并传递结构体参数

    本文将详细探讨如何在C#中调用C++编写的动态链接库(DLL),执行回调函数并传递结构体参数。这涉及到.NET Framework的P/Invoke(Platform Invoke)技术以及对C++内存管理和调用约定的理解。 首先,C#调用C++动态库...

    调用示例.rar_C#调用c++ dll_C#调用函数指针_C#调用结构体_结构体_调用C dll

    C#调用C++ dll, 包括结构体, 数组, 函数指针, 字符串等等

    c# 调用C++编写 的DLL函数各种参数传递问题。

    这篇文章将详细介绍 C# 调用 C++ 编写的 DLL 函数各种参数传递问题,包括不返回值的参数、带返回值的参数、传递结构体指针和传递结构体数组等。 1. 不返回值的参数 在 C++ 中,函数原型为 bool SendNewSms(char *...

    c#调用c++ dll 传参 string 崩溃的一种解决办法

    ### c#调用c++ dll 传参 string 崩溃的一种解决办法 在跨语言编程环境中,我们经常需要在不同编程语言之间进行交互。一个常见的场景是C#调用C++编写的动态链接库(DLL)。然而,在这种情况下可能会遇到一些问题,...

    c#调用c++DLL,dll有二维数组

    在C#中调用C++编写的动态链接库(DLL)是一项常见的跨语言编程任务,尤其是在需要利用C++的高效性能或已有的C++代码库时。本篇将详细讲解如何在C#中调用一个包含二维数组的C++DLL。 首先,我们需要了解C#与C++之间...

    C#调用C++DLL导出类

    在.NET环境中,C#代码通常与C++代码交互是通过平台调用(P/Invoke)或托管C++来实现的。然而,当涉及到C++动态链接库(DLL)中的类时,情况会变得稍微复杂一些。本文将详细介绍如何在C#中调用C++DLL中的类,以及如何...

    c++调用C# COM 参数是结构体数组

    C++ 调用 C# COM 参数是结构体数组 C++ 调用 C# COM 参数是结构体数组是一种复杂的编程技术,涉及到多种编程语言和技术。下面我们将对这个主题进行深入探讨。 C# COM 组件 在 C# 中,COM 组件是使用 ComVisible ...

    C#调用C++动态DLL

    C++函数在C#中调用时,必须遵循C的调用约定,这意味着函数应为“extern “C””,无名称修饰,并且参数类型需要是C#支持的类型。 2. **创建C#的委托类型**:在C#中,使用`delegate`关键字定义一个委托类型,其方法...

    C#调用C++的动态库Dll示例(含UsbLibDotNet使用)

    1.C#调用C++封装的动态库dll ...3.C#结构体指针的调用演示 4.C#读取USB数据设备的示例 5.C#动态调用C++dll库示例 6.C#静态调用C++dll库示例 注意:UsbLibDotNet使用时候需要先安装驱动程序才可以正常使用。

    C#调用C++ dll 传入字符参数

    4. **调用C++ DLL**:现在,你可以在C#中调用这个函数了: ```csharp string result = Marshal.PtrToStringAnsi(MyCppFunction("Hello, C++!")); Console.WriteLine(result); ``` `Marshal.PtrToStringAnsi`用于将...

    C#调用DLL中非托管C++函数参数类型对照

    在C#编程中,经常需要调用C++中的DLL类库,这就需要了解C++中的函数参数类型在C#中的对应关系。以下是基本数据类型的对照: * 一维数组:C#参数在基本类型前加ref或out,out表示有返回数据。例如调用C++的f(float[]...

Global site tag (gtag.js) - Google Analytics