[VB6 ] Dll檔呼叫規格錯誤

看板Visual_Basic作者 (河豚)時間9年前 (2015/01/24 04:11), 編輯推噓1(109)
留言10則, 3人參與, 最新討論串1/1
最近在整合Fortran跟VB6的時候發生Dll檔怎樣也掛不上去的狀況 找了很多資料還是無法找到正確解答 只好上來求助鄉民們了Q___Q 我在測試的時候 寫了一個Fortran檔 內容為 real function circle_area(radius) !DEC$ ATTRIBUTES DLLEXPORT :: CIRCLE_AREA !DEC$ ATTRIBUTES ALIAS : "Circle_Area" :: CIRCLE_AREA implicit none real radius real, parameter :: PI = 3.14159 circle_area = radius*radius*PI return end function 接著用g95跟dlltool來編譯,產生 .o .dll .def三種檔案 由.def中可以得知進入的端口是 circle_area__ 因此我在VB6裡面寫 Private Declare Function circle_area__ Lib "forlib.dll" (r As Single) As Single Private Sub Command1_Click() Dim r As Single Dim a As Single r = Val(Text1.Text) a = circle_area__(r) Label3 = Str(a) End Sub 結果,在執行時,一直顯示 a = circle_area__(r) 這行有問題 跟我說 "呼叫規格錯誤" 我上網找了很多範例,但是都沒有看到這部分的說明 不知道是編譯dll檔的過程出了問題還是程式碼敘述不對? 希望有強者可以救救小弟Q___Q 我的g95跟dlltool的指令是 1. 產生.o檔 -c $(FileName) -Wuninitialized -Wimplicit-none -Wunused-vars -Wunset-vars -fbounds-check -ftrace=full -O2 2. 產生.def檔 -z $(FileTitle).def --export-all-symbols $(FileTitle).o 3.產生.dll檔 -shared -mrtd -o $(FileTitle).dll $(FileTitle).o $(FileTitle).def -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.218.125 ※ 文章網址: https://www.ptt.cc/bbs/Visual_Basic/M.1422043917.A.34D.html

01/26 21:44, , 1F
r = Val(Text1.Text) 改 r = CSNG(Text1.Text),試試
01/26 21:44, 1F

01/27 21:32, , 2F
小弟找到問題了 官方給的資料錯誤
01/27 21:32, 2F

01/27 21:32, , 3F
產生.dll檔那行指令 應該改成
01/27 21:32, 3F

01/27 21:33, , 4F
-shared -mrtd -o $(FileTitle).dll $(FileTitle).f9
01/27 21:33, 4F

01/27 21:33, , 5F
0 (而不是.o
01/27 21:33, 5F

01/27 21:33, , 6F
只要改了這項之後就可以正常編譯了
01/27 21:33, 6F

01/27 21:34, , 7F
除了def檔需要用dlltool以外,其餘都用g95即可
01/27 21:34, 7F

01/28 16:23, , 8F
.o不是Unix的obj檔名嗎 這個link步驟看得真頭昏 @@
01/28 16:23, 8F

01/28 20:30, , 9F
M大 其實只要執行最後一個指令就好,會直接產生dll檔
01/28 20:30, 9F

01/28 20:30, , 10F
然後就可以直接掛載到VB上
01/28 20:30, 10F
文章代碼(AID): #1KmgiDDD (Visual_Basic)
文章代碼(AID): #1KmgiDDD (Visual_Basic)