C C 字串傳遞

2021-09-29 16:27:33 字數 3221 閱讀 6392

可以說新手使用p-invoke最開始的頭疼就是c#和c++的字串傳遞,因為這裡涉及到兩個問題。

第一:c#的string和c++的字串首指標如何對應。

第二:字串還有ansi和unicode(寬字串)之分。

第一:字串指標當輸入引數,

第二:字串指標作為返回值,

第三:字串指標作為輸入輸出引數。

c++部分的測試**很簡單這裡就全部貼出來了:

1#include "stdafx.h"

2#include "testdll.h"

3#include 

4#include 

5#include 67

8 staticchar* _hello ="hello,world!!";

9 static tchar * _hellow = text("hello,world!!");

1011 void __stdcall printstring(char* hello)

1215

16 void __stdcall printstringw(tchar * hello)

1720

2122 char* __stdcall getstringreturn()

2326

27tchar * __stdcall getstringreturnw()

2831

3233 void __stdcall getstringparam(char* outhello,int len)

3438

39 void __stdcall getstringparamw(tchar * outhello,int len)40

下面看c#如何呼叫。

第一:字串指標作為輸入引數,可以使用byte 和marshalas來解決。(注意四個p-invoke,兩個ansi版本,和兩個unicode版本),推薦使用marshalas方法簡單明瞭。

1 [dllimport("testdll", entrypoint ="printstring")]

2publicstaticexternvoid printstringbybytes(byte hello);

34 [dllimport("testdll", entrypoint ="printstring")]

5publicstaticexternvoid printstringbymarshal([marshalas(unmanagedtype.lpstr)]string hello);

67 [dllimport("testdll", entrypoint ="printstringw")]

8publicstaticexternvoid printstringbybytesw(byte hello);

910 [dllimport("testdll", entrypoint ="printstringw")]

11publicstaticexternvoid printstringbymarshalw([marshalas(unmanagedtype.lpwstr)]string hello);

1213

14publicvoid run()

15 第二:字串指標作為返回值,和上面一樣也有兩種宣告方法,同樣也包含兩個版本。注意:marshal.ptrtostringansi()函式的使用,把字串指標轉變為c#的string.推薦使用marshalas方法簡單明瞭。

1 [dllimport("testdll", entrypoint ="getstringreturn")]

2publicstaticextern intptr getstringreturnbybytes();

34 [dllimport("testdll", entrypoint ="getstringreturn")]

5 [return:marshalas(unmanagedtype.lpstr)]

6publicstaticexternstring getstringreturnbymarshal();

78 [dllimport("testdll", entrypoint ="getstringreturnw")]

9publicstaticextern intptr getstringreturnbybytesw();

1011 [dllimport("testdll", entrypoint ="getstringreturnw")]

12 [return: marshalas(unmanagedtype.lpwstr)]

13publicstaticexternstring getstringreturnbymarshalw();

1415

16publicvoid run()

17 1 [dllimport("testdll", entrypoint ="getstringparam")]

2publicstaticexternvoid getstringparambybytes(byte outhello, int len);

34 [dllimport("testdll", entrypoint ="getstringparam")]

5publicstaticexternvoid getstringparambymarshal([out, marshalas(unmanagedtype.lpstr)]stringbuilder outhello, int len);

67 [dllimport("testdll", entrypoint ="getstringparamw")]

8publicstaticexternvoid getstringparambybytesw(byte outhello, int len);

910 [dllimport("testdll", entrypoint ="getstringparamw")]

11publicstaticexternvoid getstringparambymarshalw([out, marshalas(unmanagedtype.lpwstr)]stringbuilder outhello, int len);

1213

14publicbyte _outhello =newbyte[10];

15publicbyte _outhellow =newbyte[20];

16public stringbuilder _builder =new stringbuilder(10); //很重要設定string的容量。

17 18publicvoid run()

19 

SendMessage 傳遞字串

sendmessage函式的原型為 lresultsendmessage hwndhwnd,uintmsg,wparamwparam,lparamlparam 用於訊息傳遞,其中有wparam 和 lparam 兩個附加引數,可以傳遞一些附加資訊,由於它們是long 型的,所以只能 傳遞數字,如果想...

傳遞字串 Linux Shell 傳遞引數

物聯網開發入門直播課 嵌入式 物聯網 快速上手linux 創客學院直播室 www.makeru.com.cn 嵌入式應用層開發 1小時全面認識linux網路經典案例 創客學院直播室 www.makeru.com.cn 我們可以在執行 shell 指令碼時,向指令碼傳遞引數,指令碼內獲取引數的格式為 ...

字串相減 c c

string a goodluck string b luck int length strlen a.c str strlen b.c str string c a.substr 0,length 主要是substr 的用法 返回乙個從指定位置開始,並具有指定長度的子字串。引數 start 必選。...