在托管VC++中使用函數(shù)指針進(jìn)行回調(diào)(實(shí)現(xiàn)回調(diào)函數(shù)功能)
最近經(jīng)常寫一些通信協(xié)議,因?yàn)榈讓邮瞻l(fā)不一樣,使用起來(lái)不方便,如果能直接像C中使用回調(diào)函數(shù)就非常方便了,比如用串口發(fā)送,則初始化時(shí)傳入串口發(fā)送的回調(diào)函數(shù),用TCP的時(shí)候就使用TCP的回調(diào)函數(shù),但是因?yàn)樯婕暗酵泄苡诜峭泄艽a的指針,使用起來(lái)還是有點(diǎn)麻煩,簡(jiǎn)單來(lái)說(shuō)就是講托管函數(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強(qiáng)制轉(zhuǎn)化為void*,再?gòu)?qiáng)制轉(zhuǎn)化為FUN類型
需要傳入的回調(diào)函數(shù)實(shí)現(xiàn),比如數(shù)據(jù)發(fā)送與接收的具體實(shí)現(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++指針即可進(jìn)行調(diào)用
協(xié)議棧中的調(diào)用,一般都是初始化時(shí)將回調(diào)函數(shù)指針傳入,使用的時(shí)候直接使用回調(diào)函數(shù)即可
void?callback(int?times,?void(*p)(int))
{
p(times);
}




