liulangdelangzi
2018-10-12 02:10
采纳率: 50%
浏览 1.6k

C#调用C++的dll,C++程序中给结构体中变量赋值this指针,对应C#中应该怎么写呢?

C++程序中有一个结构体

 struct Ctx
{
    void* owner;
    DevInfo devinfo;
};

对话框类头文件中有

 Ctx m_ctx;//回调上下文, 作为回调函数的参数

在对话框初始化程序中有

 m_ctx.owner = this;

我在C#中定义结构体

 public struct Ctx
    {
       public  IntPtr powner;
       public  DevInfo devinfo;
    }
    定义了

    public  Ctx m_ctx;

    那么怎么给m_ctx.powner赋值呢?

    下面是部分代码,需要的话也可以把代码都发出来
    C++
 BOOL Cdbc_demoDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // 将“关于...”菜单项添加到系统菜单中。

    // IDM_ABOUTBOX 必须在系统命令范围内。
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        BOOL bNameValid;
        CString strAboutMenu;
        bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
        ASSERT(bNameValid);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }

    // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
    //  执行此操作
    SetIcon(m_hIcon, TRUE);         // 设置大图标
    SetIcon(m_hIcon, FALSE);        // 设置小图标

    // TODO: 在此添加额外的初始化代码
    m_hDBC = DBC_Init();
    if (INVALID_DBC_HANDLE == m_hDBC)
    {
        MessageBox(_T("生成DBC句柄失败!"));
        return TRUE;
    }
    m_ctx.owner = this;
    m_ctx.devinfo = m_devInfo;
    DBC_SetSender(m_hDBC, OnSendFunc, &m_ctx);
    DBC_SetOnMultiTransDoneFunc(m_hDBC, OnMultiTransDoneFunc, &m_ctx);
    InitList();
    if (!InitDevice())
    {   
        MessageBox(_T("打开设备失败!"));
        return TRUE;
    }

    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • StEnchanter 2018-10-12 05:52
    已采纳

    用handle可以实现你功能吗?
    m_ctx.powner = this.Handle

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • threenewbee 2018-10-12 02:27

    很遗憾,C#不能调用C++里的类,以及this指针,你需要C++代码进一步封装,提取出不直接使用类的接口。

    评论
    解决 无用
    打赏 举报
  • xy01jh 2018-10-12 03:56

    可以借助tolua或其他方法实现互相调用的接口

    评论
    解决 无用
    打赏 举报
  • Lingxy 2018-10-12 08:32

    看看 void* owner;这个会在哪用到

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题