PInvoke 取出char *指向的內容


C++函數原型
 int GetConversationPeer(TIMConversationHandle conv_handle, char* buf, uint32_t* len);
C++調用方式:
const uint32_t MAX_LEN = 20;
char buf[MAX_LEN]  = {0 };
uint32_t len = MAX_LEN;
GetConversationPeer(conv, buf,  &len);
printf("the identifier is %s\n",buf); 
C++中能成功取出buf的數據

現在要轉換成NET版本 Pinvoke
 [DllImport(dllName, EntryPoint = "GetConversationPeer", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] 
 public static extern int GetConversationPeer(IntPtr conv_handle, [In, Out] char[] buf, ref UInt32 len); 

NET調用方式:
const UInt32 MAX_LEN = 20; 
UInt32 len = MAX_LEN; 
char[] buf003 = new char[20]; 
IMSDK.GetConversationPeer(conv1, buf003, ref len);
但是buf003里面並沒有被賦值

請問,應該怎么樣才能在NET中取出buf003數據呢

6 个解决方案

#1


char* 一般用stringbuilder來替換
stringbuilder必須要按照buffer長度先進行初始化
如果還不行
試一下CallingConvention = CallingConvention.Cdecl改為 CallConvention.Stdcall試下

#2


NET函數原型
      [DllImport(dllName, EntryPoint = "GetConversationPeer", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        public static extern int GetConversationPeer(IntPtr conv_handle,   StringBuilder buf, ref UInt32 len);
使用方式: 
  const UInt32 MAX_LEN = 1000;

UInt32 len = MAX_LEN;
                 
StringBuilder buf001 = new StringBuilder(1000);
 IMSDK.GetConversationPeer(conv1, buf001, ref len);
buf001還是沒有數據的

調用約定就是Cdecl

#3


那len等於幾?

#4


出來之后,len=0

#5


這是個out參數吧 IMSDK.GetConversationPeer(conv1, out buf003, ref len);

#6


引用 2 樓 lpsswan 的回復:
NET函數原型
      [DllImport(dllName, EntryPoint = "GetConversationPeer", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        public static extern int GetConversationPeer(IntPtr conv_handle,   StringBuilder buf, ref UInt32 len);
使用方式: 
  const UInt32 MAX_LEN = 1000;

UInt32 len = MAX_LEN;
                 
StringBuilder buf001 = new StringBuilder(1000);
 IMSDK.GetConversationPeer(conv1, buf001, ref len);
buf001還是沒有數據的

調用約定就是Cdecl

函數調用返回值是多少?

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com