우선 답변에 감사합니다!! ^^
우아.. 굉장히 복잡해 지네요....
그럼 만약에 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 에서 제공되는 나머지 함수들들 위와 같은 식으로 사용하면 됩니다.