簡體   English   中英

DLLImport c ++函數具有char *輸入和輸出參數

[英]DLLImport c++ functions with char* input as and output parameters

有關使用DllImport的某些特定問題的文章很多。 las,我經常看到對同一問題的不同答復。 例如,有人說如果c ++函數返回aa char *和int * strLen,那么有人說我應該在dllImport語句中使用StringBuilder,而其他人則說return byte [],有些人在dllImport中具有marshall語句,有些則不然沒錯 由於舊的C#/ .net版本,似乎需要一些答案。

所以問題是:如果從c ++進行的dll調用相當簡單,沒有奇怪的調用約定或其他奇怪的項目,那么如果您輸出char *和size或輸入char *和size,那么對應的DllImport函數應該是什么?

c++ .h
bool SendString(const char* pSendStr, long strSize);
bool ReadString(char* pReadStr, long& readStrSize); 

對應的DllImports是什么? 用字符串替換instr和outstr? 字符串生成器? 字符[]? 字節[]? 是否需要任何元帥聲明?

bool SendString(const char* pSendStr, long strSize);

此功能很簡單。 文本從呼叫者發送到被呼叫者。 p / invoke的聲明如下:

[DllImport(dllname, CallingConvention = CallingConvention.Cdecl)]
static extern bool SendString(string SendStr, int Len);

請注意,我假設使用cdecl調用約定,因為這是C ++代碼的默認約定。 還要注意Windows上C ++中的long為32位。 因此它與C#中的int匹配。

調用該函數時,您需要傳遞字符串及其長度。 但是,通常的約定是使用以null終止的字符串,因此不需要length參數。 我會這樣聲明非托管函數:

bool SendString(const char* pSendStr);

而p /調用是這樣的:

[DllImport(dllname, CallingConvention = CallingConvention.Cdecl)]
static extern bool SendString(string SendStr);

其他功能稍微復雜一點。 您已經這樣聲明:

bool ReadString(char* pReadStr, long& readStrSize); 

在此,調用方分配由被調用方填充的緩沖區。 您可以將StringBuilder用於文本,並讓封送拆收器為您完成工作。 p /調用為:

[DllImport(dllname, CallingConvention = CallingConvention.Cdecl)]
static extern bool ReadString(StringBuilder ReadStr, ref int Len);

約定是您提供所提供緩沖區的長度。 反過來,該函數將讓您知道它寫入了多少個字符。 您可以這樣調用該函數:

int len = 256;
StringBuilder ReadStr = new StringBuilder(len);
bool succeeded = ReadString(ReadStr, ref len);
if (succeeded)
{
    string str = ReadStr.ToString();
}

正如leppie所寫,您通常想要的是:

[DllImport(my.dll)]
static extern bool SendString(string sendString, int stringSize);
[DllImport(my.dll)]
static extern bool ReadString(StringBuilder readString, ref int readStringSize);

這將為您自動轉換為Unicode(然后轉換為Unicode)。

如果要精確訪問char *,則可以使用byte []。 這樣,就不會進行任何轉換,您可以對發生的事情有更多的控制。 通常,您不需要。 一個用例可能是您的char *可以包含\\ 0個字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM