我的想法是检查这个dll是否有我需要的版本,还是更老或更新? 我正在尝试使用THUNK / Trampoline功能。
这是我在另一个* .dll文件中的用法。
int FilterVersion(CBaseFilter* pFilter)
{
//this is line 178
void* ProgVersion = (CBaseFilter::AbstractProgVersion)(void *)&CBaseFilter::FilterVersionStatic;
return (*(CBaseFilter::AbstractProgVersion)ProgVersion)(*pFilter);
}
这是我宣布蹦床的类的声明。
class PROG_CORE_API CBaseFilter
{
friend class CProgEngineInternal;
// Trampoline Design pattern
// this FilterVersion function will be used on a global function exported from a
// cpp file exporting the dlls functions (therfore must be: static = global).
// it will use an arbitrary BaseFilter object - so Pure abstract function will
// make it possible to use polimorphism to all types of derived classes objects.
public:
typedef int (*AbstractProgVersion)(CBaseFilter&);
virtual int FilterVersionAbs() =0 ;
// a single spot (static) where all derived implemented filters versions tested.
// developer can specify version numbers to prohibit from running
// returning 0 should block the filter from loading.
static int FilterVersionStatic(CBaseFilter& FilterObj)
{
// version is 4 bytes
return FilterObj.FilterVersionAbs();
}
mutable int m_Version;
private:.....
我得到的警告是:
GCC Build Error in - AddBorders_F.cpp:178:76: error: invalid conversion from ‘CBaseFilter::AbstractProgVersion {aka int (*)(CBaseFilter&)}’ to ‘void*’ [-fpermissive]
GCC Build Error in - AddBorders_F.o] Error 1
GCC Build Error in - make: *** [AddBorders] Error 2
就我的搜索而言,我知道我错过了一个演员,但我不明白为什么?
答案 0 :(得分:1)
我不确定你在这里尝试做什么,但是那条线在很多方面被破坏了。 (不,它与int *
的任何演员表无关。int *
甚至来自哪里?代码中的任何地方都没有int *
。)
复杂转换序列中的最后一次转换是CBaseFilter::AbstractProgVersion
类型,这是一种函数指针类型。但随后您尝试使用它初始化void *
变量。函数指针类型不能隐式转换为void *
。那是你的错误。
如果您想使用显式强制转换强制进行转换,可以执行
void* ProgVersion = (void *) &CBaseFilter::FilterVersionStatic;
额外转换为CBaseFilter::AbstractProgVersion
的重点是什么?
但无论如何,void *
是一种不应与函数指针类型混合的数据指针类型。该语言不支持数据指针和函数指针之间的转换。整个方法无可救药地被打破了。
事实上,为什么在地球上你甚至做了所有这些转换?为什么不呢
int FilterVersion(CBaseFilter* pFilter)
{
return CBaseFilter::FilterVersionStatic(*pFilter);
}