介面在託管C++中的應用 (轉)
介面在託管C++中的應用:namespace prefix = o ns = "urn:schemas--com::office" />
託管的C++也就是使用在環境中的C++,也就是VC.NET,這裡不是談MFC7
事實上是VC.NET的另一部分,也就是執行在託管環境中的.雖然介面這個名詞
用的很多,不得不說介面這個詞是從COM流行開始的.隨著COM的流行這個詞也
越來越多的被使用.在COM中C++的介面實際上是實現了純虛的抽象資料定義.
例如:
COM中介面的定義:
class IClasactory :public IUnKnown
{
virual HRESULT _stdcall CreateInstance(IUnKnow *pUnKnownOuter,const IID& iid, void **ppv)=0;//注意它是純虛的
virual HRESULT _stdcall LockServer(BOOL bLock)=0;// 注意它是純虛的
}
COM中介面的實現:
class CXXCOM: public IClassFactory
{
protected:
ULONG m_Ref;
public:
CXXCOM(void);
~CXXCOM(void);
HRESULT QueryInterface(const IID& iid,void **ppv);
ULONG AddRef();
ULONG Release();
HRESULT CreatInstance(IUnKnown *,Const IID& iid,void **ppv);
HRESULT LockServer(BOOL);
}
當然MFC並不這樣做,它會從CCmdTarget 然後使用宏和一個連結串列來完成.但原理是一樣的.
當然,我談這個的目的並不是要,寫如何來實現一個COM因為那不是我寫這篇文章的目的.
我之所以要寫以上,這一段是要說明非託管的C++中實現介面實際上是用一個類中加如
純虛的函式來實現,那並不是真正的介面.因為標準C++中沒有介面這個語意.因此這是
一種變通的手法.而發展到託管環境下,幾個主流.NET語言,都實現了介面的語意.
如:
using System;
//介面定義:
interface IPoint
{
// Property signatures:
int x
{
get;
set;
}
int y
{
get;
set;
}
}
//介面實現:
class MyPoint : IPoint
{
// Fields:
private int myX;
private int myY;
// Constructor:
public MyPoint(int x, int y)
{
myX = x;
myY = y;
}
// Property implementation:
public int x
{
get
{
return myX;
}
set
{
myX = value;
}
}
public int y
{
get
{
return myY;
}
set
{
myY = value;
}
}
}
//主調:
class MainClass
{
private static void PrintPoint(IPoint p)
{
Console.WriteLine("x={0}, y={1}", p.x, p.y);
}
public static void
{
MyPoint p = new MyPoint(2,3);
Console.Write("My Point: ");
PrintPoint(p);
}
}
輸出
My Point: x=2, y=3
(該事例摘自MSDN,因為很全面沒必要自己寫)
由以上可以看出,介面提供了一組方法定義(當然上面是屬性.)這就是介面在.NET中的定義.
由於要實現語言的一致性.所以託管的C++中也存在這介面的定義如下;
__interface該關鍵字,就是說明了託管的C++中要實現介面而不是一個類.
__interface IMyInterface
{
HRESULT CommitX();
HRESULT get_X(BSTR* pbstrName);
};
這樣看起來要比virtual HRESULT CommitX() = 0;這樣看起來遠適合.NET語意.
下面我們在來討論一下它的適合條件.
1.可以從一個活多個藉口繼承而來,當然也不可以不繼承就象我上面的情況.
2.但不能從類中派生來
3.當然,如果要使用C++風格的如:
__gc __interface IMyInterface
{
public:
virtual HRESULT CommitX() = 0;
virtual HRESULT get_X(BSTR* pbstrName) = 0;
};
你可能已經注意到__gc,是的,這表示要在託管真執行.這看上去就和COM中的介面很類似了
4.因為是介面,所以沒有資料定義.那麼當然,也就沒有構造器和解構器了,自然過載運算子之類的
定義也沒理由存在.
5.告訴我靜態資料是什麼????很多情況下,靜態資料都被當成一個全域性的資料,事實上也是如此
它在程式載入初期,就是被給定了.當然,如果是在介面中這也就不成立了,因此不可以在介面中
定義靜態資料.
6.事實上,這一點我上面已經隱晦的說過了,就是介面中不能定義資料
好了,最後依然舉個例子:
#define _ATL_ATTRIBUTES 1
#include
#include
#include
#include
#include
[module(name="test")];
[ , uuid("00000000-0000-0000-0000-000000000001"), library_block ]
__interface IFace {
[ id(0) ] int int_data;
[ id(5) ] BSTR bstr_data;
};
[ coclass, uuid("00000000-0000-0000-0000-000000000002") ]
class MyClass : public IFace {
private:
int m_i;
BSTR m_bstr;
public:
MyClass() {
m_i = 0;
m_bstr = 0;
}
~MyClass() {
if (m_bstr)
::SysFreeString(m_bstr);
}
int get_int_data() {
return m_i;
}
void put_int_data(int _i) {
m_i = _i;
}
BSTR get_bstr_data() {
BSTR bstr = ::SysAllocString(m_bstr);
return bstr;
}
void put_bstr_data(BSTR bstr) {
if (m_bstr)
::SysFreeString(m_bstr);
m_bstr = ::SysAllocString(bstr);
}
};
int main() {
_bstr_t bstr("Testing");
CoInitialize(NULL);
CComObject
CComObject
p->int_data = 100;
printf("p->int_data = %dn", p->int_data);
p->bstr_data = bstr;
printf("bstr_data = %Sn", p->bstr_data);
}
Output
p->int_data = 100
bstr_data = Testing
看見上面的例子,你會說我,剛才有撒慌是嗎?不沒有,我給的例子中並沒有在
介面中定義資料,而是定義了屬性
參考資料;
corner.com/Articles/MigratingExistingAppsTo1JG.">
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993932/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何把遺留的Java應用託管在Service Fabric中Java
- 在 NGINX 上託管 Angular 應用程式的終極指南NginxAngular
- 遞迴在C++應用中的利與弊 (轉)遞迴C++
- 託管 AJAX 能否讓 Web 應用程式提速?Web
- 一個免費好用的應用託管平臺
- 用託管類庫的方式在C#中使用C++編寫的類(設計流程)C#C++
- 從C++看C#託管記憶體與非託管記憶體C++C#記憶體
- sqlserver在JAVA中的應用 (轉)SQLServerJava
- TWaver在FTTX裝置網管系統中的應用
- Category 特性在 iOS 元件化中的應用與管控GoiOS元件化
- 託管與非託管的混合程式設計程式設計
- 提供Django應用程式託管的4個免費平臺Django
- 託管C++執行緒鎖實現C++執行緒
- Serverless 時代下微服務應用全託管解決方案Server微服務
- 應用託管在SAE不登入也能通過phpmyadmin管理資料庫PHP資料庫
- 託管堆記憶體佔用記憶體
- 伺服器託管中U的含義伺服器
- 中興陳河堆:PostgreSQL在5G網管中的應用SQL
- ERP在企業中的應用(轉)
- 藉助雲託管低成本部署企業微信應用
- API介面在電商商品資料獲取中的應用API
- API資料介面在電子商務中的應用API
- 管中窺豹----.NET Core到.NET 8 託管堆的變遷
- SPI介面在LCD上的應用
- 託管在GitHub上的流行/超讚影片遊戲列表Github遊戲
- C# 託管資源和非託管資源C#
- Java在Client/Server網路中的應用 (轉)JavaclientServer
- Vector在Java程式設計中的應用 (轉)Java程式設計
- 專案管理在企業中的應用(轉)專案管理
- C#網站呼叫C++非託管dll須知C#網站C++
- 淘寶詳情API介面在各種應用中的作用性API
- 託管在GitHub上的流行/超讚視訊遊戲列表Github遊戲
- 利用IDisposable介面構建包含非託管資源物件物件
- 怎樣在Github上託管開原始碼庫Github原始碼
- Knative Serverless 之道:如何 0 運維、低成本實現應用託管?Server運維
- windows 服務中託管asp.net coreWindowsASP.NET
- 風險管理在施工專案管理中的應用(轉)專案管理
- 搭建自己的harbor(docker託管)Docker