亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C#如何調用原生C++ COM對象詳解

2020-01-26 14:21:58
字體:
來源:轉載
供稿:網友

前言

最近在工作中遇到一個問題,為了跨平臺在.net core中使用COM,不能使用Windows下的COM注冊機制,但是可以直接把IUnknown指針傳給C#,轉換為指針,再轉換為C#的接口(interface)。

做了這方面的研究,但最終我沒有使用這套技術,因為對IDispatch::Invoke的分發太麻煩了,又不能借助ATL與VS開發環境的IDL能力。所以沒有繼續研究事件訂閱(C#是event,C++COM是IConnectionPoint)。

C++中需要做的:

簡單點,實現IDispatch就可以了,全面一點,實現IManagedObject或IProvideClassInfo,后者可是個大工程。

如果我們要實現C#中定義的接口,那么最好給(不給也可以,編譯器會給每個接口一個默認的GUID)接口一個GUID,.net到你的對象QueryInterface時要處理這個IID,把IDispatch指針與S_OK返回即可。

如果跨平臺,把__uuidof換成實際的UUID即可。

struct foo : public IDispatch{  // 通過 IDispatch 繼承  virtual ULONG AddRef(void) override{return 0;}  virtual ULONG Release(void) override{return 0;}    virtual HRESULT QueryInterface(REFIID riid, void ** ppvObject) override     {      if (riid == __uuidof(IUnknown))      {    *ppvObject = (IUnknown*)this;    return S_OK;      }      IID uid;      IIDFromString(L"{C#聲明接口的GUID/IID}", &uid);      if (riid == uid)      {         *ppvObject = (IDispatch*)this;// (IUnknown*)this;         return S_OK;       }       if (riid == __uuidof(IDispatch))       {         *ppvObject = (IDispatch*)this;         return S_OK;       }       return E_NOTIMPL;   }   virtual HRESULT GetTypeInfoCount(UINT * pctinfo) override{return S_OK;}  virtual HRESULT GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo ** ppTInfo) override{return S_OK;}  virtual HRESULT GetIDsOfNames(REFIID riid, LPOLESTR * rgszNames, UINT cNames, LCID lcid, DISPID * rgDispId) override  {        *rgDispId = 1;    return S_OK;  }   virtual HRESULT Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS * pDispParams, VARIANT * pVarResult, EXCEPINFO * pExcepInfo, UINT * puArgErr) override  {        cout << "be called" << endl;    return S_OK;  }};  

再導出一個DLL的函數把指針給.net運行時

extern "C" __declspec(dllexport)foo* WINAPI GetTestObject(){  return new foo;// 簡單粗暴leak :)}

C#代碼:

[DllImport(@"foo.dll")]static extern IntPtr GetTestObject();  [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)][Guid("your uiid")]interface Test{  int func();} var v = GetTestObject();obj = (Test)Marshal.GetObjectForIUnknown(v);var value = obj.func();// 輸出be called

I love COM

COM思想很重要,COM最近不但活躍在Windows平臺,更是蔓延到了Linux,安卓,iOS等平臺。架構師,程序員應合理利用。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产亚洲福利一区| 91av在线免费观看| 精品国产成人在线| 国产精彩精品视频| 欧美电影免费观看高清完整| 成人中文字幕在线观看| 久久99热这里只有精品国产| 97香蕉超级碰碰久久免费的优势| 不卡av日日日| 精品久久久久久久久国产字幕| 国产xxx69麻豆国语对白| 成人激情免费在线| 日韩电影中文字幕一区| 亚洲女人天堂成人av在线| 精品亚洲永久免费精品| 欧美电影免费观看网站| 尤物tv国产一区| 成人免费网站在线| 久久久久久久亚洲精品| 欧美在线一级va免费观看| 亚洲精品在线不卡| 欧美日在线观看| 久久艹在线视频| 日韩免费电影在线观看| 不卡毛片在线看| 尤物九九久久国产精品的特点| 亚洲人精选亚洲人成在线| 亚洲在线免费看| 日韩欧美在线播放| 日韩精品在线影院| 日韩在线视频免费观看| 久久久久久噜噜噜久久久精品| 日韩av电影中文字幕| 亚洲深夜福利在线| 日韩视频欧美视频| 亚洲视频777| 日韩欧美精品免费在线| 亚洲激情自拍图| 久久91亚洲精品中文字幕奶水| 欧美另类69精品久久久久9999| 欧美人交a欧美精品| 日韩美女毛茸茸| 日韩电视剧免费观看网站| 中文字幕成人精品久久不卡| 久久夜色精品国产欧美乱| 欧美性xxxxxxx| 久久久久久亚洲精品中文字幕| 久久国产精品久久精品| 色青青草原桃花久久综合| 亚洲国产美女久久久久| 日韩av电影免费观看高清| 狠狠色噜噜狠狠狠狠97| 91深夜福利视频| 国产美女主播一区| 欧美日韩在线一区| 国内精品小视频在线观看| 日韩成人久久久| 欧美午夜宅男影院在线观看| 色婷婷**av毛片一区| 亚洲黄色av女优在线观看| 欧美精品在线观看| 国模极品一区二区三区| 欧美激情久久久久久| 色婷婷综合久久久久中文字幕1| 成人444kkkk在线观看| 色噜噜狠狠狠综合曰曰曰88av| 久久影视电视剧凤归四时歌| 不卡av电影院| 久久久久五月天| 国产精品久久久久久久久久99| 日韩视频中文字幕| 久久久亚洲国产天美传媒修理工| 日韩精品一区二区视频| 亚洲天堂免费在线| 欧美日韩亚洲一区二| 综合av色偷偷网| 欧美夫妻性生活视频| 久久久伊人欧美| 青青草一区二区| 亚洲国产精品网站| 亚洲精品美女在线观看播放| 日韩中文字幕免费看| 久久五月情影视| 欧美综合在线观看| 疯狂欧美牲乱大交777| 久久久久久久久中文字幕| 欧美激情精品久久久| 国产成人一区二区在线| 日韩在线视频线视频免费网站| 亚洲专区国产精品| 久久伊人91精品综合网站| 国产精品自拍偷拍| 国产成人欧美在线观看| 久久九九有精品国产23| 亚洲欧美国产日韩天堂区| 国产精品美乳在线观看| 国产精品亚洲аv天堂网| 欧美成人中文字幕| 国产一区二区三区毛片| 国产精品久久久久9999| 国产精品久久不能| 久久久国产一区二区三区| 在线观看国产精品日韩av| 国产欧美一区二区三区久久| 宅男66日本亚洲欧美视频| 国产日韩欧美中文| 日韩精品中文在线观看| 国外成人性视频| 欧美午夜激情小视频| 97久久精品人人澡人人爽缅北| 欧美乱大交做爰xxxⅹ性3| 国产精品电影一区| 亚洲在线第一页| 国产亚洲一区二区精品| 日韩经典一区二区三区| 国产精品久久久久久久久久久久久| 欧美成人激情视频| 国产精品久久久久av免费| 亚洲人成电影网| 久久99久久99精品免观看粉嫩| 国产精品最新在线观看| 久久久久久免费精品| 国a精品视频大全| 欧美性xxxxxx| 欧洲成人免费aa| 久久久久久久久爱| 一区二区三区 在线观看视| 欧美成人在线免费视频| 欧美日韩不卡合集视频| 在线日韩精品视频| 久久99久久99精品免观看粉嫩| 国产一区红桃视频| 最近免费中文字幕视频2019| 最近中文字幕mv在线一区二区三区四区| 高清一区二区三区四区五区| 日韩免费在线观看视频| 黄色一区二区在线| 国产成人精品在线观看| 俺也去精品视频在线观看| 亚洲精品资源在线| 色噜噜久久综合伊人一本| 琪琪第一精品导航| 2018国产精品视频| 亚洲国产成人久久综合一区| 好吊成人免视频| 韩国福利视频一区| 亚洲free性xxxx护士hd| 在线观看视频亚洲| 日韩免费在线看| 日本一本a高清免费不卡| 91精品国产91久久久久福利| 欧美三级xxx| 欧美极品少妇xxxxⅹ裸体艺术| 国产做受69高潮| 久久免费视频这里只有精品| 91精品在线影院| 国内成人精品一区| 久久青草精品视频免费观看| 亚洲福利影片在线| 成人在线中文字幕| 狠狠躁18三区二区一区| 久久久91精品| 国产欧洲精品视频| 狠狠躁夜夜躁人人爽天天天天97|