2015-06-19 92 views
1

我正在使用C++/CLI創建一個控制外部GPIB設備的GUI。 GUI有一個用戶可以輸入電壓的文本框。我能夠讀取這樣的文本框的電壓...在C++中將字符串^轉換爲const void *

String^ v1 = textBox1->Text; 

假設用戶正確輸入一個十進制數到文本框,我需要連接與其他一些文字該值,併產生一個const void*傳遞到gpib庫命令。

所以基本上我的問題是我怎麼能從String^轉換爲const void*?我能夠String^轉換爲Double像這樣...

Double volt1 = Double::Parse(textBox1->Text); 

因此,對於如何將Double轉換爲const void*一個解決辦法正常工作。

+1

const void *沒有足夠的信息來回答問題。它必須指向什麼樣的數據形式? –

回答

1

很奇怪,你的外部庫希望const void*,而不是一個字符指針,但假設它想要的ANSI字符串,可以使用marshal_context類轉換你String^const char*指針:

// marshal_context_test.cpp 
// compile with: /clr 
#include <stdlib.h> 
#include <string.h> 
#include <msclr\marshal.h> 

using namespace System; 
using namespace msclr::interop; 

int main() { 
    marshal_context^ context = gcnew marshal_context(); 
    String^ message = gcnew String("Test String to Marshal"); 
    const char* result; 
    result = context->marshal_as<const char*>(message); 
    delete context; 
    return 0; 
} 

(例代碼取自here)。

當然,如果你的庫需要一個Unicode字符串,你可以用marshal_as<const wchar_t*>來代替。

+1

爲什麼要動態分配'marshal_context'? –

+0

@BenVoigt不知道,該代碼逐字從msdn上的鏈接頁面。 –

0

我能解決我的問題,下面...

String^ v1 = textbox->Text; 
Double volt1 = Double::Parse(v1); 
std::string vt1 = std::to_string(volt1); 
vt1 = "Volt1 " + vt1; 
const void* vtg1 = vt1.c_str(); 

或許不會,因爲我轉換String^Doublestd::stringconst void*來解決這個問題最有效的方法,但它確實解決了我的問題,而且我找不到一種更簡單的方法來完成此任務,這可能是由於我缺乏CLI經驗。