C 實現簡單的型別庫

2021-08-29 03:30:12 字數 2369 閱讀 9541

很久以前看到有人問「如何在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 其實這問題不難...