首先,我必须承认我的编程技能非常有限,并且我接管了一个(非常小的)现有 C++ OOP 项目,我试图将自己的东西推入其中。不幸的是,我遇到了一个超出我知识范围的问题,并且我希望能在这里找到一些帮助。我正在使用第三方库(无法更改)从相机中获取图像,并将在此处使用一些占位符名称。
第三方库有一个函数“ThirdPartyGrab”来启动连续实时抓取,并获取一个指向函数的指针,每次新帧到达时都会调用该函数。所以在一个普通的 C 应用程序中它是这样的:
ThirdPartyGrab (HookFunction);
“HookFunction”需要声明为:
long _stdcall HookFunction (long, long, void*);
或声明为“BUF_HOOK_FUNCTION_PTR”
typedef long (_stdcall *HOOK_FUNCTION_PTR) (long, long, void*);
现在我有一个 C++ 应用程序和一个类“MyFrameGrabber”,它应该封装我所做的一切。所以我将钩子函数作为私有成员放入,如下所示:
long _stdcall HookFunction (long, long, void*);
我的班级中还有一个公共 void 函数“StartGrab”应该启动 Grab。在里面我试着打电话:
ThirdPartyGrab (..., HookFunction, ...);
这(不足为奇)失败了。它说对 MyFrameGrabber::HookFunction 的函数调用错过了参数列表,我应该尝试使用 &MyFrameGrabber::HookFunction 来创建一个指针。但是,传递“&MyFrameGrabber::HookFunction”会导致另一个错误,即无法将其转换为 BUF_HOOK_FUNCTION_PTR。
通读C++ FAQ 函数指针后,我想我理解了问题,但无法提出解决方案。我试图将钩子函数设为静态,但这也会导致转换错误。我也想过将钩子函数放在类之外,但我需要在钩子函数中使用类函数。有没有其他方法或者我需要改变我的整个概念?
编辑 14.01.08:我测试了单例解决方法,因为我无法更改第三方库,并且 void 指针仅用于钩子函数内部使用的数据。不幸的是,它并没有像我希望的那样开箱即用......我不知道静态函数是否需要放在一个单独的类中,所以我把它放在我的“MyFrameGrabber”类中:
static MyFrameGrabber& instance()
{
static MyFrameGrabber _instance;
return _instance;
}
long Hook(long, long, void*); // Implementation is in a separate cpp file
在我的 cpp 文件中,我有 call_hook 函数:
long MFTYPE call_hook(long x, MIL_ID y, void MPTYPE *z)
{
return MyFrameGrabber::instance().Hook(x,y,z);
}
void
MyFrameGrabber::grab ()
{
ThirdPartyGrab(..., call_hook, ...);
}
但这给了我一个错误,static MatroxFrameGrabber _instance;
因为找不到匹配的标准构造函数。这是正确的,因为我的 MyFrameGrabber 构造函数如下所示:
MyFrameGrabber (void* x,
const std::string &y, int z,
std::string &zz);
我试图放入一个空的构造函数MyFrameGrabber();
,但这会导致链接器错误。我应该将空参数传递给单例中的 MyFrameGrabber 构造函数吗?或者我是否需要一个单独的 Hook 类,如果是,我如何访问 MyFrameGrabber 函数?提前致谢。
第二次编辑 15.01.08:我应用了更改,现在可以编译和链接。不幸的是,我还不能在运行时测试它,因为它是一个 DLL,而且我还没有 Debug Caller Exe,并且在初始化等过程中还有其他问题。我会将帖子标记为答案,因为我确信这是正确的方法。