我正在使用ACE从动态加载的DLL获取功能。下面的功能symbol()返回一个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();
两个问题:
最佳答案
您需要reinterpret_cast
将对象指针(包括void*
)转换为函数指针。
如果您拥有可用的正确类型的指针,则可以指定指针的类型,而不是类型名称:
cBase * (_cdecl * pfunc)();
pfunc = reinterpret_cast<decltype(pfunc)>(...);
或者您可以从强制转换表达式中推断出指针类型:
auto pfunc = reinterpret_cast<cBase*(_cdecl *)()>(...);
但是您需要在某处指定函数类型,并且使用适当的
typedef
进行强制类型转换和变量声明可能会更清晰,更容易出错。