2013-02-28 63 views
1

我嘗試加載一個dll(這不是我的DLL),它的C++編寫LUA LOADLIB DLL

有沒有就我所知出口,但它做什麼,我需要做一次加載。

斷言(package.loadlib(dllfile, '')() 這將引發錯誤,OBV, 「程序未找到」,但該dll仍然加載,並且按預期工作。

,如果我叫上述功能的第二次,它崩潰的客戶端,所以我需要某種形式的檢查。

我的問題是,有沒有一種方法來驗證它的加載?

+1

試試'package.loadlib(dllfile,'*')'。 – 2013-02-28 15:54:36

+0

「procedure not found」 – user1594623 2013-02-28 16:32:56

+0

使用星號代替函數名稱時,不會出現此錯誤。顯示你的代碼。 – 2013-02-28 16:53:42

回答

0

在Lua中5.1使用package.loadlib作爲第二時參數,你必須指定一個函數實際上由DLL導出的名稱,如果你只是需要的話,這並不重要強制Windows動態鏈接器加載DLL(這似乎是你的情況)。

要發現這樣的名字,你可以使用DependencyWalker(免費工具)。使用depend.exe打開DLL並查看導出功能列表面板(第一列有一個E標題標籤)。選擇任何函數並將其名稱用作第二個參數(如果它確實沒有導出的函數,那麼您運氣不好!)。嘗試選擇標記爲C(而不是C++)的函數。 C++導出的函數具有可能導致問題的錯誤名稱。

例如,假設你想加載kernel32.dll:使用depend.exe你可以發現在所有導出的函數中有一個名爲AddAtomA(但是其他C函數會這樣做)。所以,你可以以這種方式使用package.loadlib

assert(package.loadlib("kernel32.dll", "AddAtomA")) 

assert調用確保,如果DLL無法加載發出一個錯誤。

要驗證DLL是否實際加載,您可以使用ProcessExplorer(另一個免費工具)。

  • 確保您的腳本運行(你可以把一個io.read()聲明在一個合適的地方,讓您的腳本終止),
  • 然後打開ProcessExplorer窗口,
  • 選擇相對於你的腳本程序(可能一些lua.exe,但您可以將ProcessExplorer工具欄上的「目標」工具拖動到您的腳本窗口以發現它)
  • 並鍵入ctrl-D。

應該出現一個下面板,顯示所選進程正在使用的所有DLL。瀏覽列表以查看是否列出了您的DLL。

希望這會有所幫助。