可以說新手使用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 必選。...