作者dogs1231992 (河豚)
看板Visual_Basic
標題[VB6 ] VB在呼叫dll檔案時會自動關閉
時間Wed Jan 28 20:54:07 2015
我今天在嘗試以VB6來呼叫dll檔時,遇到兩種情形
上網查了之後,還是不太知道怎麼解決="=
前情提要:
我寫了一個Fortran檔,用Program開頭,轉成dll檔之後進入的端口是MAIN_
(我也有改寫成Subroutine過,兩者結果會一樣,所以不是轉檔出問題)
程式內容大略為
Program
宣告變數
Open檔案,讀取設定值
Open檔案,用來輸出答案
利用設定值進行模擬運算(很複雜的矩陣跟迴圈運算)
收斂之後將結果輸出
End Program
此時,我利用VB呼叫dll檔近來,程式碼為
Private Declare Sub MAIN_ Lib "BaseCase.dll" ()
Private Sub Command1_Click()
Call MAIN_
End Sub
此時遇到了第一個問題,程式正確的被執行了,而且我確定其結果有收斂
因為我在收斂之後會輸出答案,而Output file的數據停在答案的一半不到
換個方向講就是,程式跑完之後,不知道什麼原因,答案的Write只執行到一半
程式就被關閉了(不管是在編譯器內或者輸出成EXE檔,他都會自動關閉
我本來有想說會不會是因為我的輸出數據過多,因此我就嘗試寫了另一個新的檔案
讓他輸出整數1到50000,結果沒問題(若要輸出1到50萬,則會顯示堆疊空間不足)
因此我想說是不是因為我把太多數據都寫到同一個TXT檔內,才會導致程式自動關閉?
(他這部分就沒有顯示任何訊息,突然就關閉了)
接著,我將Output的資料分開寫,寫到兩個不同的file內,此時軟體可以正常的執行
然後將所有數據都輸出
(因為我在最後有叫他輸出一個計算時間,因此我可以確定全部都有輸出
But,第二個問題出現了,我一樣用上面的那些程式碼執行
在我按第一次執行的時候,他可以得到正確的答案
但是當我再按一次時,程式又會直接關閉
(但是有執行,依照輸出結果來看,是跑到一半就停掉了)
我此時檢查output檔案,可以發現我的兩個output檔
有其中一個有被改寫,另一個則是原封不動,這表示我的程式在邊模擬邊輸出時當掉了
(這部分我是懷疑說是不是因為我的Fortran內的Open指令設定為
OPEN(UNIT=8,FILE="INPUT_DATA_FILE.TXT")
OPEN(UNIT=9,FILE="OUTPUT_DATA_FILE.TXT")
沒有給status所導致,但是我依舊無法理解說,為什麼程式會執行到一半自動關閉?
還有,為什麼我的程式明明已經順利模擬完了,卻會在輸出時寫到一半就關掉了?
我是有想到說利用下面這種方法,直接呼叫我的執行檔,這樣的話就可以無限次點取了
(每次模擬都等於呼叫一次執行檔,因此各自獨立不影響)
Private Sub Command1_Click()
Shell ("cmd /C BaseCase.exe")
End Sub
但我還是希望用成dll檔的形式,這樣未來在使用上也會比較方便
希望有好心的鄉民們教小弟如何避免上述情形
應該如何讓每次的call dll都獨立而不互相影響呢?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.23.91
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Visual_Basic/M.1422449649.A.1AF.html
1F:推 chinoyan: DLL檔的問題可能比較大 01/29 01:38
2F:推 niklee29: 寫dll不妨retuen訊息,這樣才能瞭解是否正常執行,出錯 01/29 09:39
3F:→ niklee29: 時也可知道問題發生在哪,小弟引用廠商提供的dll大多會 01/29 09:39
4F:→ niklee29: 這樣寫,也比較有利於廠商除錯 01/29 09:39