我正在创建一个包装器类,它包装了特定 3rd 方 API 中概述的一堆函数。当我尝试像这样包装非成员函数时:
(AVTcamDllWrapper.h)
typedef VmbErrorType (WINAPI * AVTGETCAMERAS) (CameraPtrVector cameras);
class CAVTcamDllWrapper
{
HMODULE mAVTCamLibrary; //I later have this point to the DLL
public:
void AVTGetCameras (CameraPtrVector cameras);
};
(AVTcamDllWrapper.cpp)
void CAVTcamDllWrapper::AVTGetCameras(AVTNS CameraPtrVector cameras)
{
AVTGETCAMERAS pFunc = NULL;
pFunc = (AVTGETCAMERAS) GetProcAddress(mAVTCamLibrary, "?GetCameras@VimbaSystem@VmbAPI@AVT@@AEAA?AW4VmbErrorType@@PEAV?$shared_ptr@VCamera@VmbAPI@AVT@@@23@AEAI@Z");
DWORD dw = GetLastError();
if(pFunc == NULL)
{
Exlog(L"CAVTcamDllWrapper::AVTGetCameras: Failed to locate AVTGetCameras method in AVTCamera DLL.");
NIERR_SET_AND_THROW_ERROR(NIERR_CAMERA_ERROR, L"Failed to locate AVTGetCameras method in AVTCamera DLL.");
}
VmbErrorType vErr = pFunc(cameras);
if(vErr != VmbErrorSuccess)
{
wstring exLogMsg = Format(exLogMsg, L"CAVTcamDllWrapper::AVTGetCameras(): Failed to get any cameras. VmbErrorType = %d", vErr);
Exlog(exLogMsg.c_str());
NIERR_SET_AND_THROW_ERROR(NIERR_CAMERA_ERROR, L"Failed to get any cameras.");
}
}
上面的代码非常适合非成员函数。例如,如果我试图包装一个简单地通过说调用的函数:
CallFunction(blah, blaaaaah);
然后包装类工作正常,并且 pFunc 设置正确并且VmbErrorType vErr = pFunc();
在线上没有发生错误;
但是,我的许多函数都是成员函数,并且是这样调用的:
SomeObject.CallMemberFunction(blah, bleh);
// or
SomeObjectPointer->CallMemberFunction(what, ever);
这些是我似乎无法包装的功能。错误发生在该行:
VmbErrorType vErr = pFunc();
因为如果没有特定的对象来调用该函数,就无法调用该函数。在我的示例中,我包装了一个存在于 Camera 内部的函数 GetCameras。在不包装函数的情况下,调用它我只需创建一个相机指针向量,然后执行以下操作:
cameras[0]->GetCameras(VmbAccessModeFull);
哪个有效。但我不知道如何包装这个函数,因为对 GetCameras 的调用既依赖于cameras[0]
又完全无用,如果没有相机来调用它。
那么如何包装上面显示的成员函数呢?
编辑1:
我试图传递对特定对象的引用并执行
VmbErrorType vErr = theObject->pFunc();
但显然这不起作用,因为它会考虑在 theObject 内部寻找一个名为 pFunc 的函数,该函数不存在。
编辑2:
我觉得我几乎要修改包装函数以将引用对象作为参数或其他东西传递。所以喜欢而不是常规:
cameras[0]->GetCameras(VmbAccessModeFull);
我将不得不修改一些东西并使我的包装函数看起来像这样:
mWrapperObject->WrappedGetCameras(VmbAccessModeFull, cameras[0]);
这样被包装的函数将具有充当成员函数所需的上下文。