我正在使用ACE从动态加载的DLL中获取函数。下面的函数符号()返回一个void指针,我必须将其转换回原来的位置。
typedef cBase * (_cdecl *typeCreateManager)( void );
// ...
ACE_DLL * m_pAceDll = new ACE_DLL;
m_pAceDll->open( "NameOfDll.dll" );
cBase * (_cdecl *pfunc)( void ); // declaration of function pointer
// can be replaced by "typeCreateManager pfunc;"
pfunc = (typeCreateManager)m_pAceDll->symbol("?createManager@@YAPAVcBase@@XZ");
// can be replaced by ???
cBase * pObject = (*pfunc)();
m_pAceDll->close();
两个问题:
哪个C ++演员代替C-like演员?静态还是重新解释?
我可以省略演员表中的typedef吗?什么是正确的语法?我不希望它在我的DLL被使用的任何地方都可见。由于我只需要代码中的少数几个地方,我想删除typedef。
答案 0 :(得分:4)
哪种C ++演员适合而不是类似C演员?静态还是重新解释?
您需要reinterpret_cast
将对象指针(包括void*
)转换为函数指针。
我可以在演员表中省略typedef吗?
如果你有一个可用的正确类型的指针,你可以指定指针的类型,而不是类型名称:
cBase * (_cdecl * pfunc)();
pfunc = reinterpret_cast<decltype(pfunc)>(...);
或者您可以从强制转换表达式中推断出指针类型:
auto pfunc = reinterpret_cast<cBase*(_cdecl *)()>(...);
但是您需要在某处指定函数类型,并且对于强制转换和变量声明使用合适的typedef
可能会更清晰且更不容易出错。
答案 1 :(得分:2)
另一种方法是使用工会。
union{
void *data;
cBase* (*pfunc)(void);
}converter;
//...
converter.data = m_pAceDll->symbol("?createManager@@YAPAVcBase@@XZ");
cBase *base = converter.pfunc();