C#如何调用C++写的 .dll文件中的二级指针?

zg80fj 2017-08-17 05:44:20
C++.dll代码如下:

typedef struct score
{
int num;
int count;
} *ptr;

int lianjia(ptr *person, int y, int z)
{
int smida;
smida=((*person)->num)+((*person)->count)+y+z;
return smida;
}


ptr为结构指针,而函数参数 *person为二级指针,
想请教下,
在C#中,该怎么调用lianjia这个函数?
困扰了2天了,还没搜到有用的资料,恳请高人指点了……
...全文
1072 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
wdonghai 2017-08-28
  • 打赏
  • 举报
回复

   public partial class Form1 : Form
    {
        [DllImport("c:\\CDLL.dll", CallingConvention = CallingConvention.Cdecl)]
        public extern static int lianjia(ref IntPtr ptr,int x,int y);

        public struct score
        {
            public int num;
            public int count;
        }

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            score t = new score();
            t.num = 1;
            t.count = 1;
            IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(t));
            Marshal.StructureToPtr(t, ptr, false);
            int i = lianjia(ref ptr, 1, 1);
            Marshal.FreeHGlobal(ptr);
            textBox1.Text = i.ToString();
        }
    }
  • 打赏
  • 举报
回复
楼上正解。。。
好大一个土豆 2017-08-18
  • 打赏
  • 举报
回复
试试在C#里导入时这样定义这个方法: public extern static int lianjia(ref IntPtr person, int y, int z) ; 当然你首先得定义一个跟score一样的结构体,使用lianjia这个方法前先创建一个score对象,再把这个对象转化为IntPtr类型的变量就可以了
赵4老师 2017-08-18
  • 打赏
  • 举报
回复
不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如: A将请求数据写到文件a.txt,写完后改名为aa.txt B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,再将b.txt改名为bb.txt A发现bb.txt存在时,读取其内容,读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢? 可以将临时文件放在RamDisk上提高效率减少磨损磁盘。 数据的结构很复杂的话,文本文件的格式问题可参考json或xml 共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的: ·进程之间松耦合 ·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。 ·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务,只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满) ·…… “跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边, 回头是“使用共享纯文本文件进行信息交流”的岸!
Eleven 2017-08-17
  • 打赏
  • 举报
回复
简单一点,你可以在C++ dll的基础之上在封装一层,简单一点供你C#调用即可。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧