2011-12-12 4 views
3

D 언어와 함께 사용하려는 작은 DLL이 있습니다. 나는이 난에 액세스 할 수있는 파일입니다 그들이 내 프로그램 :D에서 Windows DLL을 사용하는 올바른 방법은 무엇입니까?

  • b3d.dll
  • blitz3dsdk.exp
  • blitz3dsdk과 같은 디렉토리에 존재하는 C로 작성되었습니다 있으리라 믿고있어 lib 디렉토리
  • blitz3dsdk.h

여기에 내가이 DLL을 사용하는 D를 얻기 위해 시도했다입니다.


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

CyberShadow의 조언에 따라 blitz3dsdk.lib 파일을 coffimplib 도구를 사용하여 OMF 형식으로 변환하고 pragma를 사용하여 가져 왔습니다. 그런 다음 내부에 포함 된 외부 함수를 extern (C) 블록으로 정의했습니다.

예 : 나는 등 일부 유형의 변환을위한 this page에서 가이드 라인 및 모든 위대한 작품을 다음이 DLL에서 몇 기능을 시도했습니다

pragma(lib, "new.lib"); 

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

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

    return 0; 
} 

.

5

라이브러리 파일은 아마도 COFF 형식입니다. coffimplib을 사용하여 D의 링커에서 사용할 수있는 OMF 라이브러리로 변환하거나 implib을 사용하여 DLL에서 가져 오기 라이브러리를 만듭니다.

export은 가져 오기가 아닌 DLL에서 함수를 내보낼 때 사용됩니다.

관련 문제