2013-04-10 65 views
1

我對C++不太瞭解,但是我必須使用.NET來編寫一些C++代碼。我嘗試DLLImport,但我失敗了。所以我嘗試用C++/CLI來做一個包裝。C++/CLI如何翻譯此代碼?

但我不知道明白了一切......

這是我想要導出的函數(MyFunction的)基本的C + + H文件

extern "C" 
{ 
    __declspec(dllexport) IplImage* MyFunction(IplImage *src, std::string* name, OneEnumerationType myEnum, bool myBool, float myFloat); 
}  

這是包裝H代碼。

#include "MyFunction.h"; // the file containing the h code 
#include <string> 

namespace MyWrapper{ 
public ref class MyWrapperClass { 
    public: 
     MyWrapper(){}; 
     IplImage^ GetMyFunction(IplImage *src, std::string^ name, OneEnumerationType myEnum, bool myBool, float myFloat); 
} 

這是Wrapper cpp代碼。

#include "MyWrapperCode.h"; 

namespace MyWrapper{ 
IplImage^ MyWrapperClass::GetMyFunction(IplImage* src, std:string^ name, OneEnumerationType myEnum, bool myBool, float myFloat){ 
    MyFunction(src, name, myEnum, myBool, myFloat); 
} 
} 

這是我的問題:

1)當我編譯,錯誤是「‘^:不能用在類型的IplImage這種間接’和相同的消息類型‘的std :: string’ 。 我已經遵循了這一邏輯:

ClasseNative clNat2 = *clNat; --> ClasseManagee clMan2 = *clMan; 
ClasseNative &clNat3 = clNat2; --> ClasseManagee %clMan3 = clMan2; 
ClasseNative *clNat4 = &clNat2; --> ClasseManagee ^clMan4 = %clMan2; 

我所看到的,這是更好地使用系統::字符串我嘗試這種方式,但最初的功能是使用的std :: string ......順便說一句,這是爲什麼。更換好嗎?

2)如何獲得MyFunction IplImage結果?直通一個私有成員和得到我想,但我不知道如何初始化它...

3)棘手的問題。是否有可能讓CLI在IplImage .NET結構中獲得IplImage結構(來自OpenCV庫)(我的函數的結果),何時調用我的包裝?不知道這個問題是否可以理解...

非常感謝您的幫助。 在這個問題上回顧3天...

回答

1

你的包裝類需要基於System :: String ^參數的內容創建一個新的std :: string,然後傳遞給你的本地函數。否則,您需要重寫該函數以將其他內容作爲字符串輸入,例如LPWSTR或LPCSTR。

您可以編寫一個引用類,以便對所有的數據,一個是IplImage本來屬性,然後傳遞到你的包裝類。你的包裝類然後基於ref類的數據創建一個IplImage對象並傳遞給本地函數。爲返回值反轉數據複製方向。

+0

謝謝您的回答。 – PetersLast 2013-04-10 14:03:32

+0

所以我需要添加一種System :: String^myVar作爲私有變量?又如何將數據從Std :: string傳遞給System :: String? – PetersLast 2013-04-10 14:05:14

+0

作爲參數。 std:string作爲函數調用的局部變量。您的託管包裝類使用者無法識別本機std:字符串。 – 2013-04-10 17:39:15

1

1)只是通過添加^你不能改變本機對象成爲管理時,必須創建包裝或傳送數據,例如:

std::string nativeString = "my string"; 
String^ managedString = gcnew String(nativeString.c_str()); 
//now you can return it as 

2)創建一個託管的包裝或使用原語數據類型來傳輸數據

3)注意知道這是否會幫助,但看Emgu.CV

嘗試閱讀升技更多關於C++ \ CLI這裏有幾個很好的教程:

Quick C++/CLI - Learn C++/CLI in less than 10 minutes

C++/CLI for the C# programmer

+0

感謝您的第二個鏈接。我已經讀過第一個。 – PetersLast 2013-04-10 14:31:53