0
你好,因爲標題說我需要創建一個包裝,以使用它從我的C#代碼C.但事實是,我沒有C的知識,但我更好的C#。如何爲C++函數創建一個c#包裝器?
Ç
HRESULT (STDMETHODCALLTYPE *Connect)(
ExCtrl * This,
/* [in] */ EX_CONNECT *pConnect);
HRESULT (STDMETHODCALLTYPE *Disconnect)(
ExCtrl * This);
HRESULT (STDMETHODCALLTYPE *IsConnected)(
ExCtrl * This);
HRESULT (STDMETHODCALLTYPE *GetStatus)(
ExCtrl * This,
/* [out] */ ExStatus **ppStatus);
HRESULT (STDMETHODCALLTYPE *GetPreview)(
ExCtrl * This,
/* [out] */ HBITMAP *phbm);
我設法寫的 「連接」, 「斷開」, 「IsConnected」
C++
HRESULT Connect(String^ ServerIP)
{
IntPtr ptr = Runtime::InteropServices::Marshal::StringToBSTR(ServerIP);//
CComBSTR bstr; //Converting ip string
bstr.Attach(static_cast<BSTR>(ptr.ToPointer()));
if (IsConnected())
return E_UNEXPECTED; // already connected
ExCtrl *piCtrl = NULL;
HRESULT hr = Ex_CreateController(__uuidof(ExCtrl), __uuidof(ExCtrl), (void **)&piCtrl);
if (FAILED(hr)) return hr;
EX_CONNECT connection = {0}; // Connection data
connection.appType = APP_TYPE;
connection.bstrPrimaryName=CComBSTR(bstr); //
connection.layerId = (int)LAYER0 + m_iLayerNum;
connection.masterServer = SERVER_PRIMARY;
TIME_ZONE_INFORMATION tz;
connection.pTz = &tz;
hr = piCtrl->Connect(&connection);
if (FAILED(hr)) {
piCtrl->Release(); // connection failed - clear the controller
} else
m_piCtrl = piCtrl; // succefully connected
return hr;
}
bool IsConnected()
{
return (m_piCtrl != NULL);
}
HRESULT Disconnect()
{
if (!IsConnected())
return E_UNEXPECTED; // not connected
HRESULT hr = m_piCtrl->Disconnect();
if (SUCCEEDED(hr)) m_piCtrl->Release();
m_piCtrl = NULL;
return hr;
}
的問題是 「GetPreview」 我不知道如何將HBitmap轉換爲位圖。我想是這樣的:
HRESULT GetImagePreview(BITMAP bm)
{
HBITMAP hB =NULL;
tExCtrl *piCtrl = NULL;
HRESULT hr = Ex_CreateController(__uuidof(ExCtrl), __uuidof(ExCtrl), (void **)&piCtrl);
hr = piCtrl->GetPreview(&hB);
hr = GetObject(hB, sizeof(BITMAP), &bm);
return hr;
}
但沒有運氣
感謝,
看看P/Invoke,我建議不要使用C++/CLI進行包裝,即使它有時候是一個「更好看」的解決方案。 – antonijn
@AntonieBlom這太糟糕了...... – user1610015
@ user1610015怎麼樣?使用C++/CLI,您將立即失去所有**跨平臺兼容性(這種情況下不存在,但通常情況下不存在),並且您需要使用另一種語言將語言1轉換爲語言3。所以解決方法 - 對我來說。 – antonijn