我正在創建一個包裝類,它包裝了特定第三方API中列出的一堆功能。當我嘗試包裹非成員函數是這樣的:如何包裝成員函數的DLL函數?
(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, "[email protected]@[email protected]@@[email protected]@[email protected]@[email protected]@@@[email protected]@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();
,但顯然這是行不通的,因爲那會請考慮在object中查找名爲pFunc的函數,該函數不存在。
編輯2:
我覺得我幾乎有修改包裝函數傳遞引用對象作爲參數什麼的。所以像,而不是常規:
cameras[0]->GetCameras(VmbAccessModeFull);
我將不得不修改一些東西,使我的包裝功能是這樣的:
mWrapperObject->WrappedGetCameras(VmbAccessModeFull, cameras[0]);
,使包裝的功能將需要採取行動的情況下作爲成員函數。
成員函數可能需要訪問'this'指針,例如用於訪問成員變量。如果確實如此,您將*需要一些實例來調用該方法。 – 2013-02-25 16:58:35
但是,這不會產生一個錯誤,或者說,一個無法解讀的程序?它會尋找一個名爲pFunc任何對象'this'指的是內部函數,它不會找到一個,例如:如果我在'this'通過爲'theObject',然後我會做'VmbErrorType VERR = theObject - > pFunc();',這不會編譯,因爲有theObject – xcdemon05 2013-02-25 17:10:26
的內部沒有pFunc功能對於WINAPI裝飾功能,相機[0]應該是第一參數。 – 2013-03-02 09:04:24