라이브러리 링크 한 코드 보여주세요
라이브러리 님이 쓰신 글 :
: 우선 답변에 감사합니다!! ^^
:
: 우아.. 굉장히 복잡해 지네요....
:
: 그럼 만약에 32비트로 바꿔서 사용한다면 저런 절차없이 그냥 사용이 가능한가요??
:
: 그런데 32비트 dll을 implib로 lib 생성해서 프로그램 실행했더니
: (링커 설정, RTL체크 끄고/키고...)
:
:
: #include "Unit1.h"
: #include "UniDAQ.h"
:
: //---------------------------------------------------------------------------
: #pragma package(smart_init)
: #pragma resource "*.dfm"
: TForm1 *Form1;
: //---------------------------------------------------------------------------
: __fastcall TForm1::TForm1(TComponent* Owner)
: : TForm(Owner)
: {
: Ixud_DriverClose();
: }
: //---------------------------------------------------------------------------
:
:
:
: -----------------------------------------------------------------------------
: [Linker Error] Error: Unresolved external 'Ixud_DriverClose' referenced from (경로)...\DEBUG_BUILD\UNIT1.OBJ
:
: 라는 링커 에러가 나옵니다... 그냥 사용은 불가능 한 건가요??;;; 에겅;;
:
: 빌더 님이 쓰신 글 :
: : 라이브러리 님이 쓰신 글 :
: : : 라이브러리 프로젝트 추가시
: : : [Linker Error] Error: ' contains invalid OMF record, type 0x21 (possibly COFF)
: : :
: : : 라는 에러 메시지가 나옵니다... COFF는 VC++ 라이브러리라 바꿔 줘야 한다고 검색해보니 나오는 것
: : :
: : : 같더라구요... 그런데 어떻게 바꿔줘야 할지... ㅠㅠ.. 바꿔도 이상하게 되는 것같아 도움 요청합니다...
: : :
: : : 라이브러리 나름 바꾸고 나니 함수에러가 나더라구요...
: : : [Linker Error] Error: Unresolved external 'Ixud_DriverClose' referenced from
: : :
: : : 저 에러는 함수를 제대로 찾을 수 없다고 하는것같던데...
: : :
: : : 어떻게 해줘야 할지 막막합니다 ㅠㅠ;;
: : :
: : : 빌더에서 사용가능하게끔 변환시켜주시면 감사하겠습니다..
: : :
: : : 오전안으로 써봐야 해서... 빠르게 부탁드립니다!!! ㅠㅠ
: :
: :
: :
: :
: :
: : 답변:
: :
: : RAD 툴에서는 64비트 C++ 컴파일러가 제공되지 않기 때문에 C++로는 컴파일 할 수 없습니다.
: : Delphi64 비트 컴파일러를 사용하면 가능 하기는 한데, RAD 툴에서 제공하는 IMPLIB 는 64비트를 지원하지 않죠.
: : 그러나 IMPLIB 없이도 가능 합니다.
: :
: :
: : 예를 들어... UniDAQ.h 를 보면...
: :
: : EXPORTS WORD CALLBACK Ixud_GetDllVersion(DWORD *wDLLVer);
: :
: : Ixud_GetDllVersion() 함수가 위와 같은 식으로 선언되어 있는데...
: :
: :
: : 파스칼 유닛에서 다음과 같은 식으로 Import 함수를 선언 하세요.
: :
: :
: : function Ixud_GetDllVersion(var X: Cardinal): Word; {stdcall}
: : external 'UniDAQ.dll';
: :
: : implementation
: :
: : {$R *.dfm}
: :
: : procedure TForm2.Button1Click(Sender: TObject);
: : var
: : dllVersion : Cardinal;
: : begin
: : Ixud_GetDllVersion(dllVersion);
: : end;
: :
: :
: : 위와 같은 식으로 VC로 컴파일 되어있는 64비트 DLL을 사용하면 됩니다. 컴파일은 Delphi 64 비트로...
: :
: : 위에서 코멘트 되어있는 stdcall은 의미가 없습니다. 32비트 플렛폼에서는 여러가지 Calling Convention이 사용
: : 되지만, 64비트 CPU 아키텍쳐에서는 가용 레지스터가 대폭 확장 되었기 때문에 Calling Convention을 레지스터를
: : 통한 방식 하나로 통일해서 사용하기로 정했기 때문입니다.
: :
: : UniDAQ.DLL 에서 제공되는 나머지 함수들들 위와 같은 식으로 사용하면 됩니다.