C#调用c++ dll 封送结构体数组,无法成功

问题描述

C#调用c++ dll 封送结构体数组,无法成功

c++代码:
class qf

private:
char *id;
char *mc;

float sd;
int LX;
};
函数:int EntryPoint(qf *qfw);

c#代码:
public class qf
{
private string id;
private string mc;
private float sd;
private int LX;
};
c#调用:
qf[] qfw = new qf[2];
for (int i = 0; i < qfw.Length; i++)
{
qfw[i] = new qf(t, t, (float)0.5, 1);
}

        IntPtr[] ptrarr = new IntPtr[1];
        ptrarr[0] = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(qf)) * 2); //分配包含两个元素的数组
        IntPtr pt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(qf)));
        Marshal.Copy(ptrarr, 0, pt, 1); //拷贝指针数组  

        dll.EntryPoint( pt);

可以进入c++,但是传进去的pt是乱码?这是为何呢?求大神解释?

解决方案

指针应该列集为IntPtr。
调用的时候需要用Marshal.AllocHGlobal或者Marshal.AllocCoTaskMem之类的函数申请一块固定的内存,把内存地址保存到IntPtr再列集。
当然,谁分配谁释放,就算中间出异常了也不要搞内存泄漏就是。

如果C++代码改了指针目标内存的数据,想把IntPtr指针指向的内存复制成字符串的话,
可以用Marshal.PtrToStringAnsi或者Marshal.PtrToStringUni把字符数据复制到托管堆。

解决方案二:

c++中是class,但是其实存储的都是数据,并没有任何成员操作函数,所以在C#中,你可以处理为struct,后面依然是通过marshal中相关structure操作函数
进行操作~ 函数名称具体忘记了,可以查阅下marshal类~

ps:最好能在开发中调试下pt的地址是否有效

解决方案三:

为什么我传进去的LX是ptraar【0】的值

解决方案四:

自己顶~顶啊顶自己顶~顶啊顶自己顶~顶啊顶自己顶~顶啊顶自己顶~顶啊顶

解决方案五:

自己顶~顶啊顶自己顶~顶啊顶自己顶~顶啊顶自己顶~顶啊顶自己顶~顶啊顶自己顶~顶啊顶

解决方案六:

  1. 看能否使用结构体来传
  2. 一共四个成员 char* 和string 互转是乱码 那int类型和float类型也是乱码?如果int类型和float传值OK的话 看是否要Convert一下
    如果int和float传值也是乱码 ,检查一下是否是有效的指针地址

解决方案七:

c++中用char 数组,而不是指针

时间: 2024-08-19 23:45:07

C#调用c++ dll 封送结构体数组,无法成功的相关文章

调用C++DLL时遇到结构体类型难题

问题描述 C++DLL里的一个函数:HRESULTDSStream_EnumVideoCompressor(VideoCompressorInfo*pInfo,int*piVidCompNum)得到系统中安装的视频压缩算法的信息.pInfo:指向一片预先分配的VideoCompressorInfo结构.如果为NULL,piVidCompNum将得到系统中安装的视频压缩算法的数目.piVidCompNum:如果pInfo不为NULL,piVidCompNum表示pInfo中包含多少个VideoCo

调用vc++的dll怎么返回结构体数组

问题描述 c++代码:typedefstruct{intDevice_id;intDevice_ch;intDevice_total;intcar_id;charcar_Info[10];charm_status;}Deviceflag,*LPDeviceflag;#defineNETDVR_API__declspec(dllexport)NETDVR_APILONG__stdcallNET_DVR_Login(char*dwIP,unsignedshortdwPort,char*dwUseNa

dll结构体-C#调用DLL结构体,第一次成功,第二次的时候就报错。尝试读取或写入受保护的内存。

问题描述 C#调用DLL结构体,第一次成功,第二次的时候就报错.尝试读取或写入受保护的内存. C++代码 typedef struct tagIDCardData{ char Name[32]; //姓名 char Sex[6]; //性别 char Nation[20]; //名族 char Born[18]; //出生日期 char Address[72]; //住址 char IDCardNo[38]; //身份证号 char GrantDept[32]; //发证机关 char User

c++-怎么在一个结构体里调用本身结构体数组

问题描述 怎么在一个结构体里调用本身结构体数组 typedef struct XML_DATA{ struct XML_DATA DATA[10]; char MENU[10][256]; ezxml_t xml; char *txt; char *strAttr; char *file; };XML_DATA m_data[10]; 这样使用为什么会报错,应该怎么修改?谢谢大家帮忙看看咯. 解决方案 定义变量要使用:struct XML_DATA m_data[10];要不就要改结构体的定义,

c#调用C++的传结构体数组指针的问题

问题描述 C++的原型函数:CRTEXPORTCOURT_RECORD_RESCALLBACKCourtRecordGetKeyValue(COURT_PARAM_KEYkey,void*data);typedefenumCOURT_PARAM_KEY{KEY_MERGE_MAP,KEY_OUTPUT_MAP};data是根据不同的key来传入不同的结构体数组:现我用C#调用如下写法:[DllImport("CourtRecord.dll")]publicstaticexternCOU

python c++ 传参-python 调用C++函数,关于结构体传参问题

问题描述 python 调用C++函数,关于结构体传参问题 python 调用C++函数,C++函数的参数类型是pyobject*,其实是一个结构体数组 类似于 #define NUM 32 stuct A { int a; int b; }; struct B { int len; A ab[NUM]; } 请问在python中如何将这个结构体数组表示出来并传给 C++函数. 我在python中用类表示的 class A: def init(self): self.a=0 self.b=0 c

dll里面初始化结构体,返回应用程序指向结构体的指针,应用程序可以通过这个指针读取它的成员变量吗

问题描述 dll里面初始化结构体,返回应用程序指向结构体的指针,应用程序可以通过这个指针读取它的成员变量吗 dll里面初始化结构体,返回应用程序指向结构体的指针,应用程序可以直接通过这个指针读取它的成员变量吗? 解决方案 当然是可以的.但是更好的方式是把分配内存的工作交给调用者去做.因为这样不容易忘记释放内存.申请和释放的代码成对出现. 参考windows api里的GetWindowRect,它由调用者传入一个lpRect结构体指针,函数获取了窗口坐标,填充它. 解决方案二: 只要是在同一个

c++-Visual Basic 6.0 读取一个C++编写的DLL中的结构体函数

问题描述 Visual Basic 6.0 读取一个C++编写的DLL中的结构体函数 Visual Basic 6.0 读取一个C++编写的DLL中的结构体函数,几个函数公用一个内存有没有问题?需要复制内存么? 解决方案 http://blog.itpub.net/102086/viewspace-792251/

struct-关于结构体指针与结构体数组

问题描述 关于结构体指针与结构体数组 目前开发遇到一个问题,有一个动态库dll,需要传进去一个结构体数组,函数为 opt_api_init(InfoInitMarket* InitMarketInfo): 这个是结构体 typedef struct tagInfoInitMarket { char commID[COMMODITY_ID + 1]; //合约编码 char classID[CLASS_ID + 1]; //品种代码 char instrumentType; //合约类型:期货:F