全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3000
推到 Plurk!
推到 Facebook!

請幫忙,沒有入口的DLL如何寫?

答題得分者是:RaynorPao
swotcoder
一般會員


發表:1
回覆:16
積分:8
註冊:2003-07-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-08-04 05:57:10 IP:210.3.xxx.xxx 未訂閱
請幫忙,沒有入口的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 #include #include extern "C" { char *my_name(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error); } char *my_name(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error) { char * me = "my name"; return me; } 我自行將由C builder向導建立的代碼由上述代碼替換,編譯後發覺用tdump無法找到任何可用函數,正常情況下應該可以看到" my_name "存在。 請問這種情況應該如何處理呢?新手發問,多多包涵。 還有看了下C builder的幫助,使用/ws參數無法進行編譯,而且幫助中提到的設置方法我並沒有從IDE界面找到而是直接手工修改xml工程文件添加。去掉這個參數可以編譯,但是會有non-publice symbol "my_name"的提示。=_=!!! 發表人 - swotcoder 於 2003/08/04 05:59:01
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-08-04 08:52:50 IP:203.73.xxx.xxx 未訂閱
引言: 請幫忙,沒有入口的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 #include #include extern "C" { char *my_name(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error); } char *my_name(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error) { char * me = "my name"; return me; } 我自行將由C builder向導建立的代碼由上述代碼替換,編譯後發覺用tdump無法找到任何可用函數,正常情況下應該可以看到" my_name "存在。 請問這種情況應該如何處理呢?新手發問,多多包涵。 還有看了下C builder的幫助,使用/ws參數無法進行編譯,而且幫助中提到的設置方法我並沒有從IDE界面找到而是直接手工修改xml工程文件添加。去掉這個參數可以編譯,但是會有non-publice symbol "my_name"的提示。=_=!!!
swotcoder 你好:
(1)你原來利用 VC   寫的 DLL,程式碼應該不需要轉到 C   Builder 裡面,就
   可以讓 C   Builder 使用的吧
    >
   >    -- 
        
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
swotcoder
一般會員


發表:1
回覆:16
積分:8
註冊:2003-07-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-08-04 09:21:16 IP:61.179.xxx.xxx 未訂閱
Hi RaynorPao,感謝您的回復。 MySQL UDF是指用戶自定義函數,是一個不需要入口點的DLL。用VC建立空DLL就可以編寫,而BCB中一個通宵都沒有搞定。哎~ 真不知道怎麼是好了 >_< P.S 是要MySQL來用,不是給BCB用啦。。;)
swotcoder
一般會員


發表:1
回覆:16
積分:8
註冊:2003-07-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-08-04 10:35:50 IP:61.179.xxx.xxx 未訂閱
差不多找出問題所在了。    之前出現 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-08-04 10:45:49 IP:203.73.xxx.xxx 未訂閱
引言: 差不多找出問題所在了。 之前出現 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-08-04 11:52:43 IP:61.179.xxx.xxx 未訂閱
謝謝,以前從來沒用過這種轉換搞定了。我還想問一下, 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-08-04 17:23:20 IP:203.73.xxx.xxx 未訂閱
引言: 謝謝,以前從來沒用過這種轉換搞定了。我還想問一下, 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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-08-04 22:29:29 IP:210.3.xxx.xxx 未訂閱
事實上是蠻困擾我的,已經到了茫然的地步。    程序已經編譯通過而代碼也不存在錯誤,在MySQL中已經可以安裝但是一調用這個UDF會自動導致MySQL Server崩潰。而且利用MySQL Server的Debug功能也無法截取絲毫信息。    為了達到目的我使用了三種方法:    1 如版大所提出的代碼 __declspec(dllexport) 與 __stdcall 組合; 2 模塊定義文件與 __stdcall 組合; 3 模塊定義文件與直接修改編譯器call方式為stdcall組合    上述三種方法均宣告失敗。是不是我真的不適合用
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-08-04 22:36:09 IP:61.221.xxx.xxx 未訂閱
引言: 事實上是蠻困擾我的,已經到了茫然的地步。 程序已經編譯通過而代碼也不存在錯誤,在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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-08-04 23:28:05 IP:210.3.xxx.xxx 未訂閱
RaynorPao 你好,    我目前实在是想不出如何进行测试。同样的代码在VC环境下编译后可以直接使用并未发觉已知问题。我只是简单的将环境转移到bcb中,代码非常简单也不该牵扯到环境差异才是吧?     > # > # > # > me = "my name"> 编译选项按照其他文章中的建议调整为静态,不使用其它的packs.
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-08-04 23:38:24 IP:61.221.xxx.xxx 未訂閱
引言: RaynorPao 你好, 我目前实在是想不出如何进行测试。同样的代码在VC环境下编译后可以直接使用并未发觉已知问题。我只是简单的将环境转移到bcb中,代码非常简单也不该牵扯到环境差异才是吧? > # > # > # > me = "my name"> 编译选项按照其他文章中的建议调整为静态,不使用其它的packs.
swotcoder 你好: 先利用 DebugView 這個執行期除錯工具來找問題吧 做無謂的猜測,對實際的情況,也是沒有幫助的
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
swotcoder
一般會員


發表:1
回覆:16
積分:8
註冊:2003-07-12

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-08-05 00:07:21 IP:210.3.xxx.xxx 未訂閱
< >感谢指导,这样子进行 >< > 發表人 -
swotcoder
一般會員


發表:1
回覆:16
積分:8
註冊:2003-07-12

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-08-05 00:26:55 IP:210.3.xxx.xxx 未訂閱
问题彻底解决,这是 >
系統時間:2024-11-22 4:30:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!