2011-12-12 32 views
3

我有一個小的dll,我想用D語言。我假設它已經用C寫的這些都是我要訪問的文件和它們在同一目錄作爲我的程序:在D中使用windows dll的正確方法?

  • b3d.dll
  • blitz3dsdk.exp
  • blitz3dsdk存在的.lib
  • blitz3dsdk.h

這裏就是我試圖讓d使用此DLL。


test.d

pragma(lib, "blitz3dsdk.lib"); 

int main(string[] Args) 
{ 
    bbBeginBlitz3D(); 
    bbEndBlitz3D(); 

    return 0; 
} 

編譯: DMD test.d -w -Wi -debug
結果:Error 43: Not a Valid Library File.


Blitz3D SDK.d

module Blitz3DSDK; 

// __declspec(dllimport) int bbBeginBlitz3D() - from the header file. 
export extern (Windows) int bbBeginBlitz3D(); 

// __declspec(dllimport) void bbEndBlitz3D() - from the header file. 
export extern (Windows) void bbEndBlitz3D(); 

test.d

import Blitz3DSDK; 

int main(string[] Args) 
{ 
    bbBeginBlitz3D(); 
    bbEndBlitz3D(); 

    return 0; 
} 

編譯: DMD test.d -w -wi -debug
結果:Error 42: Symbol Undefined [email protected]Error 42: Symbol Undefined [email protected]


任何想法如何使用此DLL或任何有用的最新在線指南,將不勝感激。這是一段時間,因爲我已經擺弄了本地代碼和共享庫等。

回答

0

以下是Cyber​​Shadow的建議,我使用​​工具將blitz3dsdk.lib文件轉換爲OMF格式並使用編譯指示導入。然後我定義了它包含在extern (C)塊中的外部函數。

例子:

pragma(lib, "new.lib"); 

extern (C) 
{ 
    int bbBeginBlitz3D(); 
    void bbEndBlitz3D(); 
} 

int main(string[] Args) 
{ 
    bbBeginBlitz3D(); 
    bbEndBlitz3D(); 

    return 0; 
} 

我已經從這個dll從this page準則對於某些類型等的轉換,所有的偉大工程以下幾個功能嘗試過。

5

庫文件可能是COFF格式。使用​​將其轉換爲可與D的連接器一起使用的OMF庫,或使用implib從DLL創建一個導入庫。

export用於從DLL中導出函數,而不是用於導入它們。

相關問題