bcb中函数指针参数的问题、迷茫多天、希望版主大人和各位高手兄弟们指点指点

Thorpy 2005-01-24 10:35:47
dll中函数原型:
DllExport int __stdcall Sgip12Start(LPCTSTR sLocalIP, int nLocalPort, LPCTSTR sPeerIP, int nPeerPort, LPCTSTR sLoginName, LPCTSTR sLoginPwd, int nConnType, LPCTSTR sSrcNum, void (__stdcall *m_PDeliver)(DeliverStr* deliver), void (__stdcall *m_PReport)(ReportStr* report), void (__stdcall *m_PResponse)(MTRespStr* response), void (__stdcall *m_PMTError)(MTErrorStr* mterror), int nConnCount, bool OuptutDebugInfo);
我的调用程序:
.h中
// 申明四个回调函数
其中ReportStr DeliverStr ReportStr MTErrorStr 分别是struct
typedef void _fastcall(__closure *dtOnResponse)(ReportStr &ReportStr);
typedef void _fastcall(__closure *dtOnDeliver)(DeliverStr &ondeliver);
typedef void _fastcall(__closure *dtOnReport)(ReportStr &stReport);
typedef void _fastcall(__closure *dtOnMTError)(MTErrorStr &stError);
// 申明dll库中的接口函数
void(_stdcall *Sgip12Start)(AnsiString sLocalIP, int nLocalPort, AnsiString sPeerIP, int nPeerPort,
AnsiString sLoginName, AnsiString sLoginPwd, AnsiString sSrcNum,
dtOnDeliver pfMO, dtOnReport pfReport,dtOnResponse pfMtResp, dtOnMTError pfMtErr,
int nConnCount, bool fOuptutDebugInfo);
cpp中:

void onReport(ReportStr mt_rep)
{
return;
}
void onDeliver(DeliverStr mt_del )
{
return;
}
void onMTerror(MTErrorStr mt_err)
{
return;
}






HINSTANCE DllInst=NULL;
if(!DllInst)
DllInst=LoadLibrary("sgip.dll");
if(DllInst)
{
ShowMessage("动态链接库链接成功!");
Sgip12Start=(void(_stdcall*)(AnsiString, int , AnsiString , int ,
AnsiString , AnsiString , AnsiString ,
dtOnDeliver , dtOnReport pfReport,dtOnResponse , dtOnMTError,
int , bool))GetProcAddress(DllInst,"Sgip12Start");
if(Sgip12Start)
{
ShowMessage("this function is ok");
Sgip12Start("问现在该如何来写,上面我写的对吗?关键是函数指针不会");
}



}
else
{
ShowMessage("动态链接库链接失败!");
}

存在问题:这些类型(void (__stdcall *m_PDeliver)(DeliverStr* deliver), void (__stdcall *m_PReport)(ReportStr* report), void (__stdcall *m_PResponse)(MTRespStr* response), void (__stdcall *m_PMTError)(MTErrorStr* mterror),)的参数该如何处理~!我上面的该如何来
修改~!
只要问题解决马上给分........在线等.大家就帮帮忙吧~~!
...全文
310 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Thorpy 2005-01-28
  • 打赏
  • 举报
回复
虽然还不是很清楚。但是还是结了吧。。。
不过还是谢谢3996906这位大哥了哈
3996906 2005-01-26
  • 打赏
  • 举报
回复
Value of type void is not allowed: 说是void值类型不被允许,你改成需要的类型

回调函数的例子

声明 在类声明前面
typedef void __fastcall (__closure *ReportAdjustDropPacked)(bool increment);

.h
ReportAdjustDropPacked OnReportAdjustDropPacked;

.cpp

在符合条件时,你需要的地方写上这个函数指针

OnReportAdjustDropPacked(true);
或者OnReportAdjustDropPacked;都可以

用的时候

先定义一个函数
void __fastcall TFrmVideo::ReportAdjustDropPacked(bool inc)
{
//TODO: Add your source code here
if(Compress)
{
Compress->IncCODECRate(inc);
}
}

把这个函数指针赋值给它
P2PVideo->OnReportAdjustDropPacked = ReportAdjustDropPacked;


jemyzhang 2005-01-25
  • 打赏
  • 举报
回复
说的不是很清楚,到底有什么问题
constantine 2005-01-25
  • 打赏
  • 举报
回复
这个不是dll吗?
你的函数参数也多了点吧
看:3楼的
空中猎手 2005-01-25
  • 打赏
  • 举报
回复
听楼上的吧~~~最近做短信的怎么这么多~~~
3996906 2005-01-25
  • 打赏
  • 举报
回复
存在问题:这些类型(void (__stdcall *m_PDeliver)(DeliverStr* deliver), void (__stdcall *m_PReport)(ReportStr* report), void (__stdcall *m_PResponse)(MTRespStr* response), void (__stdcall *m_PMTError)(MTErrorStr* mterror),)的参数该如何处理~!我上面的该如何来
修改~!
只要问题解决马上给分........在线等.大家就帮帮忙吧~~!
-----------------------------------------------------------------------------

传函数指针进去

自己定义符合要求的函数

void 类名::DeliverStr(void)
{
}

用的时候把 DeliverStr 当参数传进去,不要(),
Thorpy 2005-01-25
  • 打赏
  • 举报
回复
还有。在bcb中如何申明回来函数了。又怎么样来调用呢?
Thorpy 2005-01-25
  • 打赏
  • 举报
回复
传函数指针进去

自己定义符合要求的函数

void 类名::DeliverStr(void)
{
}

用的时候把 DeliverStr 当参数传进去,不要(),
-----------------------------------------------------------------------------------
我是像你说的那样做的阿.可是出这样的错你认为我什么地方错了吗?
[C++ Error] Unit1.cpp(68): E2468 Value of type void is not allowed
veryhappyboy 2005-01-25
  • 打赏
  • 举报
回复
Sgip12Start=(FARPROC)GetProcAddress(DllInst,"Sgip12Start");
if(Sgip12Start)
{
ShowMessage("this function is ok");
Sgip12Start(就好像调用函数一样,添入相应参数的值就行啦。);
}
从横四海 2005-01-25
  • 打赏
  • 举报
回复
up
ch_builder 2005-01-25
  • 打赏
  • 举报
回复
楼主的问题应该放在基础区
按楼上的说法是不是还出问题,你先把函数类型一致了
其实CB的函数指针若不是继承VCL得到的与其实C编译工具是一样的,没有什么特别之处
若是从VCL中继承得到的,那是单线、虚函数就有些麻烦了
sczyq 2005-01-25
  • 打赏
  • 举报
回复
dll中函数原型: 函数采用 __stdcall,而在调用时则用 __fastcall

显然函数声明调用方式不一致,肯定不行,应当将__fastcall改成 __stdcall
过客猫2022 2005-01-25
  • 打赏
  • 举报
回复
是啊,看3楼的,你看看函数指针的定义

13,874

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧