請幫忙,沒有入口的DLL如何寫? |
答題得分者是:RaynorPao
|
swotcoder
一般會員 發表:1 回覆:16 積分:8 註冊:2003-07-12 發送簡訊給我 |
請幫忙,沒有入口的DLL如何寫?
我要寫MySQL的udf,之前都是在VC環境下現在打算轉到Borland C++ Builder。
簡單介紹下MySQL的udf,MySQL的udf並不需要設計入口點,所以每次在VC平台之上我創建一個空DLL工程便可開工。托模塊定義文件(.def)的福,當某個函數需要供MySQL使用時在.def裡邊加上就好。MySQL Server在Windows平台加載udf的函數如下,實際就是利用Win32 API在我看來是不該挑編譯器才是。
void* dlopen(const char* libname,int unused)
{
return LoadLibraryEx(libname,NULL,0);
}
上述代碼來自MySQL SERVER,版權歸屬MySQL AB所有。 但是現在我按照如下步驟建立的UDF利用tdump查看並沒有任何函數可供調用,請指導。 1 file->new->other->dll wizard
2 source type :C , MT.其他沒選擇
3 手工建立.def文件並加入工程,內容如下:
LIBRARY UDF_EXAMPLE
DESCRIPTION 'Example Using UDF with VC '
VERSION 1.0
EXPORTS
my_name
4 設置頭文件路徑用來引入mysql.h
5 定義宏 HAVE_DLOPEN 測試時所使用代碼來自MySQL郵件列表,MySQL AB依照vc環境列舉的例子。
如下:
#include
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 請幫忙,沒有入口的DLL如何寫? 我要寫MySQL的udf,之前都是在VC環境下現在打算轉到Borland C Builder。 簡單介紹下MySQL的udf,MySQL的udf並不需要設計入口點,所以每次在VC平台之上我創建一個空DLL工程便可開工。托模塊定義文件(.def)的福,當某個函數需要供MySQL使用時在.def裡邊加上就好。MySQL Server在Windows平台加載udf的函數如下,實際就是利用Win32 API在我看來是不該挑編譯器才是。 void* dlopen(const char* libname,int unused) { return LoadLibraryEx(libname,NULL,0); } 上述代碼來自MySQL SERVER,版權歸屬MySQL AB所有。 但是現在我按照如下步驟建立的UDF利用tdump查看並沒有任何函數可供調用,請指導。 1 file->new->other->dll wizard 2 source type :C , MT.其他沒選擇 3 手工建立.def文件並加入工程,內容如下: LIBRARY UDF_EXAMPLE DESCRIPTION 'Example Using UDF with VC ' VERSION 1.0 EXPORTS my_name 4 設置頭文件路徑用來引入mysql.h 5 定義宏 HAVE_DLOPEN 測試時所使用代碼來自MySQL郵件列表,MySQL AB依照vc環境列舉的例子。 如下: #include swotcoder 你好: (1)你原來利用 VC 寫的 DLL,程式碼應該不需要轉到 C Builder 裡面,就 可以讓 C Builder 使用的吧 > > --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
swotcoder
一般會員 發表:1 回覆:16 積分:8 註冊:2003-07-12 發送簡訊給我 |
|
swotcoder
一般會員 發表:1 回覆:16 積分:8 註冊:2003-07-12 發送簡訊給我 |
差不多找出問題所在了。 之前出現 non-publice symbol 'my_name' 是因為我在模塊定義檔.def 定義了 my_name 而編譯器產生的是 _my_name.
然後發現一個奇怪的問題,不知道怎麼做才好。我嘗試給函數之前加__stdcall居然編譯不通過?這如何是好? [C++ Error] udf.cpp(7): E2138 Conflicting type modifiers
extern "C" { char __stdcall *my_name(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error); } char __stdcall *my_name(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)
{
char *me = "my name"; return me;
} > 發表人 -
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 差不多找出問題所在了。 之前出現 non-publice symbol 'my_name' 是因為我在模塊定義檔.def 定義了 my_name 而編譯器產生的是 _my_name. 然後發現一個奇怪的問題,不知道怎麼做才好。我嘗試給函數之前加__stdcall居然編譯不通過?這如何是好? [C Error] udf.cpp(7): E2138 Conflicting type modifiers extern "C" { //char __stdcall *my_name(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error); __declspec(dllexport) char* __stdcall my_name(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error); } //char __stdcall *my_name(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error) char* __stdcall my_name(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error) { char *me = "my name"; return me; } >>>< face="Verdana, Arial, Helvetica"> swotcoder 你好: 如果改成以上這樣寫呢?? --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
swotcoder
一般會員 發表:1 回覆:16 積分:8 註冊:2003-07-12 發送簡訊給我 |
謝謝,以前從來沒用過這種轉換搞定了。我還想問一下,
Exports from udf.dll
2 exported name(s), 2 export addresse(s). Ordinal base is 1.
Sorted by Name:
RVA Ord. Hint Name
-------- ---- ---- ----
000020F8 2 0000 ___CPPdebugHook
00001244 1 0001 my_name
這裡的這個__CPPdebugHook 是誰的?從什麼地方可以去掉呢?
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 謝謝,以前從來沒用過這種轉換搞定了。我還想問一下, Exports from udf.dll 2 exported name(s), 2 export addresse(s). Ordinal base is 1. Sorted by Name: RVA Ord. Hint Name -------- ---- ---- ---- 000020F8 2 0000 ___CPPdebugHook 00001244 1 0001 my_name 這裡的這個__CPPdebugHook 是誰的?從什麼地方可以去掉呢?swotcoder 你好: 據小弟我所知,那個 function 是由 C Builder 自動產生的,用來做為 VCL 的特殊用途或是 Debug 用的,也因此是無法把它拿掉的;不過話又說回來了, 即使存在著那一個 function 的話,也應該不會影響你要達成的目的吧 --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
swotcoder
一般會員 發表:1 回覆:16 積分:8 註冊:2003-07-12 發送簡訊給我 |
事實上是蠻困擾我的,已經到了茫然的地步。 程序已經編譯通過而代碼也不存在錯誤,在MySQL中已經可以安裝但是一調用這個UDF會自動導致MySQL Server崩潰。而且利用MySQL Server的Debug功能也無法截取絲毫信息。 為了達到目的我使用了三種方法: 1 如版大所提出的代碼 __declspec(dllexport) 與 __stdcall 組合;
2 模塊定義文件與 __stdcall 組合;
3 模塊定義文件與直接修改編譯器call方式為stdcall組合 上述三種方法均宣告失敗。是不是我真的不適合用
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 事實上是蠻困擾我的,已經到了茫然的地步。 程序已經編譯通過而代碼也不存在錯誤,在MySQL中已經可以安裝但是一調用這個UDF會自動導致MySQL Server崩潰。而且利用MySQL Server的Debug功能也無法截取絲毫信息。 為了達到目的我使用了三種方法: 1 如版大所提出的代碼 __declspec(dllexport) 與 __stdcall 組合; 2 模塊定義文件與 __stdcall 組合; 3 模塊定義文件與直接修改編譯器call方式為stdcall組合 上述三種方法均宣告失敗。是不是我真的不適合用>>< face="Verdana, Arial, Helvetica">swotcoder 你好: (1)你所說的崩潰,是否有任何錯誤訊息?? (2)你是否已經把你的 DLL Project 編譯成 standalone 呢?? http://delphi.ktop.com.tw/topic.php?TOPIC_ID=21675 (3)建議你能夠試著先把問題給釐清,也就是說,自己先寫一個 EXE 來測試這個 DLL 看有沒有問題,確認沒有問題以後,再跟 MySQL 做整合-- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
swotcoder
一般會員 發表:1 回覆:16 積分:8 註冊:2003-07-12 發送簡訊給我 |
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: RaynorPao 你好, 我目前实在是想不出如何进行测试。同样的代码在VC环境下编译后可以直接使用并未发觉已知问题。我只是简单的将环境转移到bcb中,代码非常简单也不该牵扯到环境差异才是吧? > # > # > # > me = "my name"> 编译选项按照其他文章中的建议调整为静态,不使用其它的packs.swotcoder 你好: 先利用 DebugView 這個執行期除錯工具來找問題吧 做無謂的猜測,對實際的情況,也是沒有幫助的
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
swotcoder
一般會員 發表:1 回覆:16 積分:8 註冊:2003-07-12 發送簡訊給我 |
|
swotcoder
一般會員 發表:1 回覆:16 積分:8 註冊:2003-07-12 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |