私は、次のようなdll( "so.dll")定義を持っています。C++でdllからインポートされた間違ったオブジェクトの検出と消去
/////// "IOReader.h" //////////////
class IOReader
{
public :
IOReader() {};
virtual ~IOReader() {};
virtual bool open(const std::string &format,
const std::string &fileName, const int mask) = 0;
std::string errorMessage;
};
// "IOReader.h" Ends Here
// ---- so.dll ----/
//////////////// sio.h ////////////
#ifdef SEIO_EXPORTS
#define SEIO_API __declspec(dllexport)
#else
#define SEIO_API __declspec(dllimport)
#endif
#include <string>
#include "IOReader.h"
class SReaderIO : public IOReader
{
public:
SReaderIO() {};
bool open(const std::string &format,
const std::string &fileName, const int mask)
{
return true;
}
};
class TestWrongClass
{
public:
TestWrongClass() { };
bool open(const std::string &format,
const std::string &fileName, const int mask)
{
return true;
}
};
SEIO_API TestWrongClass* CreateIOReader()
{
TestWrongClass * module = new TestWrongClass();
return module;
}
//// sio.h ends here ///////
//in the main executable I am loading the dll on run time
// and after creating a object of type TestWrongClass,
//I explicitly try to cast it with the wrong object, as follows
/// Main Source //
#include <iostream>
#include <windows.h>
#include "IOReader.h"
int main()
{
HMODULE hDLL=LoadLibrary(L"sIO.dll");
CreateSealafineReaderFn _funcSelafinCreator = NULL;
_funcSelafinCreator = (CreateSealafineReaderFn) GetProcAddress (hDLL,
"CreateIOReader");
// Method 1
void *Iref = (_funcSelafinCreator)();
IOReader * locReader = NULL;
locReader = reinterpret_cast <IOReader *>(Iref); // but how to check
// that object locReader is not of base type IOReader
// so that I may call delete Iref
// If I try to do as follow, then I get illegal error from compiler
// locReader = dynamic_cast <IOReader *>(Iref); // illegal
// Method 2
try
{
locReader = dynamic_cast <IOReader *>((_funcSelafinCreator)());
// works but how can I check wrong casting and catch exception
} catch (std::bast_cast)
{
// how to clear the object created by CreateIOReader
}
}
//
私はこのプロセスを行う理由は、メインプログラムがDLLディレクトリ からスキャンされるすべてのDLLは、同じ名前のメソッドを持つことが可能かどうかを確認することです、しかし作成のポインタ型を返しますその方法による対象物は異なることがあり、これは望ましくない。 (上記の場合では、この方法は、CreateIOReaderある)
Iがのdynamic_castを使用する場合、私はbad_cast例外を確認することができ、しかし、オブジェクトが既にDLL内に作成され、Iため、解放されません dllの内部コードにアクセスできない
私がreintepret_castを使って与えた上記のメソッドは動作しますが、正しいオブジェクト型が返されるかどうかはチェックできません。 キャストが正しい型でない場合、Irefポインタ "delete Iref"でdeleteを呼び出して、ヒープからオブジェクトをクリアすることができます。
方法CreateIOReaderで間違ったオブジェクトの作成を確認するため、あなたを助けることができない。この問題dynamic_cast
のために実行可能なソースコード
タイプ 'CreateSealafineReaderFn'はどのように展開されますか? – Smeeheey
@Smeeheeyステートメントを追加するのを忘れていた typedef IOReader *(* CreateSealafineReaderFn)(); justfor int main() – Gourish