策略測試程序,DLL和FreeLibrary()
Results 1 to 2 of 2

Thread: 策略測試程序,DLL和FreeLibrary()

  1. #1
    我已經看到這里和那裡提到的這個問題,特別是7bit,但我從來沒能解決這個問題:

    在deinit()期間,egy測試器沒有正確地減少加載庫的引用計數。因此,DLL文件在系統中保持加載狀態,並在您再次嘗試運行測試程序時崩潰。

    我嘗試使用GetModuleHandle()和FreeLibrary(),但似乎沒有解決問題。

    插入代碼if(IsTesting()){int dll_handle = DLLHandle(C:\ Program Files(x86)\ MT \ experts \ libraries \ SQLBridgeV2.dll);打印(dll_handle); if(dll_handlegt; 0)FreeLibrary(dll_handle);更正:
    dll_handle返回一個非0數字,FreeLibrary減少它。

    如果我再次檢查GetModuleHandle(),我得到0 - 這應該意味著庫被卸載。

    但是,如果我再次啟動測試儀,它仍然會崩潰。

    這變得非常煩人,因為我無法使用優化功能。

    究竟發生了什麼? DLL的全局變量是否仍被最後一次運行的數據初始化和污染?或者嘗試在已初始化的DLL上初始化DLL時是否發生錯誤?

  2. #2

    Quote Originally Posted by ;
    但是,如果我再次啟動測試儀,它仍然會崩潰。這變得非常煩人,因為我無法使用優化功能。究竟發生了什麼? DLL的全局變量是否仍被最後一次運行的數據初始化和污染?或者嘗試在已初始化的DLL上初始化DLL時是否發生錯誤?
    這指出了DLL中的問題。它沒有正確地破壞/釋放所有內存/對象,或者更可能是因為它導致崩潰 - 在第二次嘗試重新啟動期間的某個時刻,您正在使用指針或對不再存在的內容的引用。如果不看DLL,就不可能確切地說出這是什麼。但是你需要:1)注意你的DLL的initdeint 2)DLL_entry_point()函數不會被第二次調用,因為DLL沒有被卸載所以不要使用它。將代碼從此處放入您從MT4調用的函數中以初始化DLL。 3)確保在Deinit期間處理在init例程之外創建的任何內存/對象嘗試以類似於以下的方式修改DLL initdeint:Inserted Code Global vars objptr:pointer = nil;/對象指針初始化為nil memptr:pointer = nil; func DLL_INIT()//來自MT4 init(){if(objptr == nil)objptr = somobject.create();/創建對象} func DLL_some例程()//來自EA中某處的mt4調用{memptr = getmem(somememory);/用內存做點什麼......我們不會在這個函數的末尾釋放內存! } func DLL_Deint()//來自mt4 deinit(){if(objptr!= nil){objptrfree; objptr = nil; } if(memptr!= nil){freemem(memptr,somememory); memptr = nil;如果以這種方式創建/alloe所有內存/objs動態變量,你應該避免引用不存在的東西。

發布權限

  • 您不可發布新主題
  • 您不可回复
  • 您不可發布附件
  • 您不可編輯您的帖子
  •  
  • BB代碼是打開的
  • 表情符號是打開的
  • [IMG]代碼是打開的
  • [視頻]代碼是打開的
  • HTML代碼是關閉的
forex-pedia網站使用cookie 文字跟蹤
forex-pedia.com網站使用cookie 文字跟蹤,某些設定已經固定。您可以點擊此處閱讀我們的Cookie使用說明。 請點擊右鍵接受我們的cookies。如果您選擇繼續使用forex-pedia.com網站,我們將認為您接受我們的cookies。