c#调用c++dll返回一个(结构体,对象)指针,再将(结构体,对象)指针传参给dll

c#调用c++dll返回一个(结构体)指针,再将(结构体)指针作为参数传给dll的函数

最近在项目中发现需要在dll中返回一个指针句柄给C#,然后再将指针句柄作为参数,在调用dll的时候传进去。文章没有选择在c#这边重写一个对应的结构体,而是选择使用 Intptr类型 来接受从DLL返回的 (结构体)指针,在网上查阅了好多资料都没发现自己想要的,特此整理一下本次的实现方法,方便后续查阅
本文并不是标准的传参方式,是自己摸索出来的,如果有不对的地方,欢迎大佬指正

dll

创建一个结构体
头文件

**头文件**
#pragma once
#ifdef DLLMAIN_EXPORTS
#define CREATDLL_API __declspec(dllexport)
#else
#define CREATDLL_API __declspec(dllimport)
#endif // CREATDLL_EXPORTS

#include <vector>

struct MyStruct
{
	int POS_X, POS_Y;

	std::vector<int> StructPoint;
};

extern "C" CREATDLL_API MyStruct * CreatInstance(int x, int y);//创建结构体实例,返回一个结构体指针

extern "C" CREATDLL_API int ChangeStruct(MyStruct* m_Struct,int value,int& x,int& y,int& size);//修改传入的结构体指针的值,做验证

CPP

**cpp**

#include "pch.h"
#include "dllmain.h"


#region  不必理会这一段,项目模板自带的
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
#endregion

//头文件实现
 MyStruct* CreatInstance(int x, int y)
{
     MyStruct* stru = new MyStruct;
     stru->POS_X = x;
     stru->POS_Y = y;
     stru->StructPoint.push_back(x);
     stru->StructPoint.push_back(y);

    return stru;
}

 int ChangeStruct(MyStruct* m_Struct, int value, int& x, int& y, int& size)
{
     m_Struct->POS_X += value;
     m_Struct->POS_Y += value;
     m_Struct->StructPoint.push_back(value);
     x = m_Struct->POS_X;
     y = m_Struct->POS_Y;
     size = m_Struct->StructPoint.size();

    return  1;
}

C#调用dll

        class demo
       {
           **创建调用函数**
           [DllImport("SampleCode.dll")]
           public static extern IntPtr CreatInstance(int x, int y);
           [DllImport("SampleCode.dll")]
           public static extern int ChangeStruct(IntPtr intPtr, int value, out int x, out int y, out int size);
        }

        **测试函数**
        IntPtr instance;//这个最好放到函数外边,不然容易报错
        private void button7_Click(object sender, EventArgs e)
        {
            int mPOS_X, mPOSY, mSIZE;
            instance = demo.CreatInstance(10, 10);
            demo.ChangeStruct(instance, 10, out mPOS_X, out mPOSY, out mSIZE);
            MessageBox.Show($"指针首次初始化变量值 _X = 10,_Y = 10,通过返回的指针更改值以后的值为 _X = {mPOS_X}, _Y = {mPOSY}, _mSIZE = {mSIZE}");
            return;
        }

输出结果
在这里插入图片描述
以上为整个过程,如果有不对的地方,欢迎指正,非常感谢!

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值