라이브러리 님이 쓰신 글 :
: 라이브러리 프로젝트 추가시
: [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 에서 제공되는 나머지 함수들도 위와 같은 식으로 사용하면 됩니다.