2010-05-03 148 views
0

使用VS2008託管C++來封裝dll。本地方法採用一系列單個const char *值和一組char *值。要做出表率作用:將字符串^和字符串^集合轉換爲常量字符*

Function1(char * value1, TF_StringList& catList); 

TF_StringList是一個DLL類3種插入方法,一個我想使用的是:

TF_StringList::insert(const char* str); 

所以我成立了一個包裝方法:

WrapperClass::callFunction(String^ mvalue1, ArrayList mcatList); 

mvalue1使用轉換爲const char *:

const char* value1 = (char*)(Marshal::StringToHGlobalAnsi(mvalue1)).ToPointer(); 

然而,當到達字符串的集合,我遍歷它使用索引獲取每個字符串:

String^ mstr = mcatList[i]; 

試過將字符串轉換^爲const char *和在任何情況下,TF_StringList每路: :insert(const char * str)方法拋出一個C2663錯誤,它與值的常量有關。 問題是什麼?

回答

1

您的代碼片段沒有幫助,它們無法按給定方式編譯,也不顯示錯誤的實際來源。查看MSDN Library docs for C2663,它與該參數沒有任何關係。對象指針是問題。

請注意,發送的StringToHGlobalAnsi()調用是內存泄漏。您完成字符串後,您在返回的IntPtr上調用Marshal :: FreeHGlobal()。有人將不得不復制它。

+0

鑑於錯誤是在非const函數調用insert(const char * str)上拋出的,它所抱怨的「this」指針是str。我的問題是如何從ArrayList中得到字符串作爲插入函數正在查找的「const char *」? 我完全知道char *指針需要清理,但只需要清理已經成功創建的內容。現在我在創建事物時遇到問題。 我的研究表明,您發佈的鏈接僅涵蓋了C2663的一個原因。 – 2010-05-03 18:07:28

+0

「this」指針不是str。我建議你發佈真正的代碼,可以重新編譯這個編譯錯誤。 – 2010-05-03 20:10:46

+0

如果您是道歉的話,它所抱怨的這個指針是TF_StringList的實例指針,我聲明爲const,實例化並試圖通過insert方法添加字符串。刪除了const修飾符,它工作正常。謝謝 – 2010-05-04 10:58:11

0

包括

#include <vcclr.h> 

然後在範圍

{ 
    String^ s = gcnew String("test string"); 
    pin_ptr<const wchar_t> str = PtrToStringChars(s); 

    size_t origsize = wcslen(orig) + 1; 
    const size_t newsize = 100; 
    size_t convertedChars = 0; 
    char nstring[newsize]; 
    wcstombs_s(&convertedChars, nstring, origsize, orig, _TRUNCATE); 

    CallFunction(&nstring); 
} 

的重要組成部分,被釘扎指針,以便它不會對你在一個垃圾收集搬遷。