我正在编写的DLL中有以下导出函数
DLLEXPORT int HttpFilterProc(FilterContext* context, unsigned int eventType, void* eventData) {
switch (eventType) {
case kFilterAuthUser:
return Authenticate(context, eventData);
default:
return kFilterNotHandled;
}
}
此方法签名不在我的控制范围内,所以我无法更改它,我想调用以下方法
int Authenticate(FilterContext *context, FilterAuthenticate *authData) {
FilterRequest requestInfo;
char temp[255] = " ";
int errId;
}
我知道对于kFilterAuthUser的情况,void * eventData的类型将是FilterAuthenticate typedef struct。
问题是我得到了上面代码的编译错误,我不明白为什么,我从这些工作的例子中遵循这一点,所以我知道这应该有效。我正在使用Visual Studio 2015并编写Win32 DLL,任何人都可以解释为什么我收到此错误并建议我如何解决。
答案 0 :(得分:3)
如评论中所述,您需要将void*
参数类型转换为所需类型(在您的案例中为FilterAuthenticate*
),然后再将其传递给Authenticate(....)
。
这样做:
return Authenticate( context, static_cast<FilterAuthenticate*>(eventData) );
答案 1 :(得分:3)
您收到错误是因为您将void指针传递给需要其他类型指针的函数。由于void指针不能隐式转换为c ++中的其他指针,因此尝试这样做是错误的。
您可以显式地将void指针转换为任何其他指针。因此,如果您知道指针实际指向的对象类型,那么您需要通过使用static_cast
转换为正确的指针类型来与编译器分享知识。
答案 2 :(得分:2)
DLLEXPORT int HttpFilterProc(FilterContext* context, unsigned int eventType, void* eventData) {
switch (eventType) {
case kFilterAuthUser:
return Authenticate(context, (FilterAuthenticate *)eventData);
default:
return kFilterNotHandled;
}
}
您必须将void * data
转换为FilterAuthenticate *
。