簡體   English   中英

如何將 ATL com object 從 c++ 傳遞到 c#

[英]How to Pass an ATL com object from c++ to c#

使用 ATl,我創建了一個名為“Comptes”的 com object,它具有名稱、用戶名等屬性。 這是 atl 項目的 idl 文件

import "oaidl.idl";
import "ocidl.idl";

[
    object,
    uuid(15297371-6D05-4466-B80D-26207555CD28),
    dual,
    nonextensible,
    pointer_default(unique)
]
interface Icompte : IDispatch{
    [propget, id(1)] HRESULT name([out, retval] BSTR* pVal);
    [propput, id(1)] HRESULT name([in] BSTR newVal);
    [propget, id(2)] HRESULT sername([out, retval] BSTR* pVal);
    [propput, id(2)] HRESULT sername([in] BSTR newVal);
    [propget, id(3)] HRESULT email([out, retval] BSTR* pVal);
    [propput, id(3)] HRESULT email([in] BSTR newVal);
    [propget, id(4)] HRESULT phone([out, retval] BSTR* pVal);
    [propput, id(4)] HRESULT phone([in] BSTR newVal);
};
[
    uuid(73A9DD4C-CE2D-4419-9F95-4A84C4E3B271),
    version(1.0),
]
library ATLOBJECTSLib
{
    importlib("stdole2.tlb");
    [
        uuid(1199A9AD-8AF7-4A25-A10B-DD06FB294B2E)      
    ]
    coclass compte
    {
        [default] interface Icompte;
    };
};

i have inculded the header and cpp file in an c++ mfc project and was able to estantiate the com object,now in the mfc project i am sending data to c# project (just simple strings) this the mfc part:

void CmfcappDlg::OnBnClickedCreateacountbutt()
{

    CoInitializeEx(nullptr, COINIT::COINIT_MULTITHREADED);
    Icompte* pcompte;

    HRESULT hr = CoCreateInstance(CLSID_compte,nullptr,CLSCTX_INPROC_SERVER,IID_Icompte,(LPVOID*)&pcompte);
    if (SUCCEEDED(hr)) 
    {
        namectrl.GetWindowText(name);
        sernamectrl.GetWindowText(sername);
        emailctrl.GetWindowText(email);
        phonectrl.GetWindowText(phone);
        
        pcompte->put_name(name.AllocSysString());
        pcompte->put_sername(sername.AllocSysString());
        pcompte->put_phone(phone.AllocSysString());
        pcompte->put_phone(email.AllocSysString());
        //Managed::showcswindow(name, sername);

    }

    CoUninitialize();
}

現在我可以用這個 class 將 dat 發送到 c# 部件:

#include "stdafx.h"
#include "Managed.h"
#using <System.dll>
using namespace System;
using namespace ::gettingdatafromc;

void Managed::showcswindow(CString name,CString sername)
{
    services::showwindow(gcnew String(name), gcnew String(sername));
}

並使用此 class 在 c# 項目中接收它:

namespace gettingdatafromc
{
    public static class services
    {
        public static void showwindow(string name, string sername)
        {

        }
    }
}

一切正常,除了我想通過將 com object 作為參數傳遞給 showwindow 方法而不是簡單的字符串給 c# 項目來發送 com object

嘗試將原始IUnkown*指針傳遞給 C#,然后使用Marshal.GetObjectForIUnknownIntPtr轉換為object ,然后將此 object 轉換為Icompte 您需要在 C# 項目中添加對相應 TypeLib 的引用才能執行此類轉換。

感謝您的友好回復,所以我在應用程序中遵循了您的指南,我使用了新的 showwindow2 方法:

CoInitializeEx(nullptr, COINIT::COINIT_MULTITHREADED); Icompte* pcompte;

HRESULT hr = CoCreateInstance(CLSID_compte,nullptr,CLSCTX_INPROC_SERVER,IID_Icompte,(LPVOID*)&pcompte);
if (SUCCEEDED(hr)) 
{
    namectrl.GetWindowText(name);
    sernamectrl.GetWindowText(sername);
    emailctrl.GetWindowText(email);
    phonectrl.GetWindowText(phone);
    
    pcompte->put_name(name.AllocSysString());
    pcompte->put_sername(sername.AllocSysString());
    pcompte->put_phone(phone.AllocSysString());
    pcompte->put_phone(email.AllocSysString());
    
    //Managed::showcswindow(name, sername);
    Managed::showcswindow2(pcompte);
}

CoUninitialize();

可以在 managed.cpp 中找到,我將 Iunknow 傳遞給 csahrp 方法):

 void Managed::showcswindow2(IUnknown* p)
{
    
    services::showwindow2((IntPtr)p);

}

在 csharp 代碼中:

public static void showwindow2(IntPtr p)
        {

            Icompte c = (Icompte)Marshal.GetObjectForIUnknown(p);
            string b =  c.name;
        }

dll 已經注冊並被引用;

現在的問題是csharp代碼中object的屬性是空的,字符串b是null。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM