在托管VC++中使用函數(shù)指針進行回調(diào)(實現(xiàn)回調(diào)函數(shù)功能)
最近經(jīng)常寫一些通信協(xié)議,因為底層收發(fā)不一樣,使用起來不方便,如果能直接像C中使用回調(diào)函數(shù)就非常方便了,比如用串口發(fā)送,則初始化時傳入串口發(fā)送的回調(diào)函數(shù),用TCP的時候就使用TCP的回調(diào)函數(shù),但是因為涉及到托管于非托管代碼的指針,使用起來還是有點麻煩,簡單來說就是講托管函數(shù)使用委托,然后將委托的指針找到,轉(zhuǎn)換為C++指針,然后就可以訪問了。
添加命名空間
using?namespace?System::Runtime::InteropServices;
聲明托管
delegate?void?ProcessDelegate(int?len); ProcessDelegate?^funCallBack1;
初始化托管,并獲取托管函數(shù)的托管指針
funCallBack1?=?gcnew?ProcessDelegate(this,?&溫濕度采集::Form1::printGoodbye); IntPtr?pvFun?=?Marshal::GetFunctionPointerForDelegate(funCallBack1);//可將pvFun強制轉(zhuǎn)化為void*,再強制轉(zhuǎn)化為FUN類型
需要傳入的回調(diào)函數(shù)實現(xiàn),比如數(shù)據(jù)發(fā)送與接收的具體實現(xiàn),用串口還是TCP方式收發(fā)數(shù)據(jù)
void?printGoodbye(int?len) { ???printf("送客送客?--?%d/n",?len); }
初始化,傳入外部接口的函數(shù)指針
callback(10,?(void(*)(int))pvFun.ToInt32());//將托管的指針變?yōu)?2bit的C++指針即可進行調(diào)用
協(xié)議棧中的調(diào)用,一般都是初始化時將回調(diào)函數(shù)指針傳入,使用的時候直接使用回調(diào)函數(shù)即可
void?callback(int?times,?void(*p)(int)) { p(times); }