![](/img/trans.png)
[英]How do I marshal wchar_t* from C++ to C# as an out parameter or return value?
[英]How can I marshal this character array parameter from C to a string in C#?
我有以下函數,作為C中另一個類的一部分編寫的:
int example(char *remoteServerName)
{
if (doSomething(job))
return getError(job);
if (job->server != NULL) {
int length = strlen(jobPtr->server->name); // name is a char * of length 1025
remoteServerName = malloc (length * sizeof(char));
strncpy(remoteServerName, jobPtr->server->name, length);
}
return 0;
}
如何從中獲取remoteServerName
? 我嘗試了以下方法:
[DllImport("example.dll")]
public static extern int example(StringBuilder remoteServerName);
var x = new StringBuilder();
example(x);
Console.WriteLine(x.ToString());
但是字符串始終為空。
您需要為返回的字符串分配一些空間。
var x = new StringBuilder();
提供容量值:
var x = new StringBuilder(1024);
您還應該刪除對malloc
的調用。 調用方分配內存。 這就是與StringBuilder
編組的目的。
您沒有正確使用strncpy
,因此無法編寫空終止符。 您可以像這樣傳遞緩沖區長度:
int example(char *remoteServerName)
{
if (doSomething(job))
return getError(job);
if (job->server != NULL) {
// note that new StringBuilder(N) means a buffer of length N+1 is marshaled
strncpy(remoteServerName, jobPtr->server->name, 1025);
}
return 0;
}
但這將有點浪費,因為它隱含了所有的零填充。 確實, strncpy
是無用的,您應該使用其他函數來復制,就像之前在這里多次討論的那樣。 我真的不想被這個問題吸引住,因為這個問題有點離題。
設計API以允許調用者也傳遞字符數組的長度是明智的,這樣被調用者可以確保不溢出緩沖區,從而無需在此處使用魔術常數作為代碼。做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.