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个回答

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

cseling99
cseling99 我调通了,这个参数没用,不用理它。
接近 2 年之前 回复
StEnchanter
StEnchanter 回复liulangdelangzi: 有handle了,基本可以操作窗体
接近 2 年之前 回复
liulangdelangzi
liulangdelangzi 谢谢
接近 2 年之前 回复
liulangdelangzi
liulangdelangzi 这样应该是可以的,程序没有报错,谢谢。但还没运行起来,可能是其他地方的问题
接近 2 年之前 回复

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

caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复liulangdelangzi: 需要重新封装
接近 2 年之前 回复
liulangdelangzi
liulangdelangzi 我在C#里重写了类(窗体),只想调用接口函数,但接口函数的参数有个Ctx结构体,结构体中变量赋值是this
接近 2 年之前 回复

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

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

cseling99
cseling99 回复liulangdelangzi: C#回调函数这个问题搞定了吗?我也碰到了这个问题
接近 2 年之前 回复
liulangdelangzi
liulangdelangzi 就是在在对话框初始化程序中有 m_ctx.owner = this;这是C++里的用法
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐