很久以前看到有人問「如何在c++中實現動態載入類」時,簡單地做了乙個。
不過當時沒有去考慮動態載入dll的情況。
今天在[email protected]中也有人問到這個問題,就把它給做完了。
當然只是簡單地做到了「從全域性型別庫中,根據類名建立例項,支援動態dll載入」,說得更明白點:
在另乙個顯式載入的dll中(即呼叫loadlibrary載入),向全域性型別庫中註冊其它幾個型別。這時通過loadlibrary載入這個dll,就可以生成這幾個型別的例項了。
這地方不能上傳檔案,就把**貼一點吧:
typelib.h檔案:
#ifndef __type_lib_h__
#define
__type_lib_h__
typedef
void*(
*create_func)();
typedef
void(*
release_func)(
void*);
void
regtype (
const
char
*name, create_func cfunc, release_func rfunc);
void
*createobject (
const
char
*name);
void
releaseobject (
const
char
*name,
void
*p);
struct
itestinte***ce
virtual
void
print ()
const=0
;};template
<
class
t>
void
*create ()
template
<
class
t>
void
release (
void*p)
#endif
//__type_lib_h__
typelib.cpp檔案:
#include
"typelib.h
"#include
<
string
>
#include
<
map>
using
namespace
std;
namespace
typeregistry
}void
regtype (
const
char
*name, create_func cfunc, release_func rfunc)
void
*createobject (
const
char
*name)
void
releaseobject (
const
char
*name,
void*p)
把它編譯成靜態lib或dll,就可以使用了。
在那2個為我們提供型別的dll中,dllmain函式中加入下面的**: //
firsttest和secondtest是2個類名
regtype(
"firsttest
", create
<
firsttest
>
, release
<
firsttest
>
);regtype(
"firsttest
", create
<
secondtest
>
, release
<
secondtest
>);
就可以向全域性型別庫中註冊型別。注意在型別庫中是沒有儲存類資訊的,所以最好是使用單根類庫來做。
下面是一點測試**:
intmain()
itestinte***ce
*test
=(itestinte***ce
*)createobject (class_name.c_str());if(
!test)
test
->
print ();
releaseobject (class_name.c_str(), test);
}return0;
} 還有乙個沒考慮的地方,就是沒有給它加鎖,因為有可能在乙個執行緒中載入乙個dll。
不過我還有些懷疑這東西是否真的有用?
c 簡單型別
型別bcl 型別 說明示例 object system.object 所有其他型別的最終基型別 object o null string system.string 字串型別 字串是 unicode 字串行 string s hello sbyte system.sbyte 8 位有符號整型 sby...
python呼叫c 動態庫的簡單實現
新建乙個vs專案之後選擇包含dll 專案名for dll 在for dll.cpp中新增 如下 for dll.cpp 定義 dll 應用程式的匯出函式。右鍵專案生成即可。新建iotest.py,內容如下 import ctypes dll ctypes.cdll.loadlibrary d for...
c 的指標型別簡單總結
c 的指標型別,問題源於如下一件事情的爭論。1.如下位址設定 int array 4 int p int array 1 位址 1 int p2 int array 1 位址的位址 1 cout p 1 0 cout p2 1 3 與同事一起討論,為什麼p2的位址 1後取得的資料是3 其實這問題不難...