2015-01-01 8 views
0

델파이에 대한 몇 가지 기본 지식을 알고 있습니다. (사실 저는 몇 년 동안이 파일을 사용하고 있습니다 ...)Delphi에서 외부 DLL을 올바르게 호출 하시겠습니까?

저는 DLL로 벽을 치고 있습니다.

unit Unit1; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls; 

Type FT_Result = Integer; 

type 
    TForm1 = class(TForm) 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 


var 
    Form1: TForm1; 
    FT_HANDLE : DWord = 0; 



implementation 

{$R *.dfm} 

function I2C_GetNumChannels(numChannels: dword):FT_Result; stdcall; external 'libmpsse.dll' name 'I2C_GetNumChannels'; 
function I2C_OpenChannel(index:dword;handle:pointer):FT_Result; stdcall; external 'libmpsse.dll' name 'I2C_OpenChannel'; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
numofchannels:dword; 
begin 
i2c_getnumchannels(numofchannels); 
showmessage(inttostr(numofchannels)); 
end; 

end. 

내가 USB 포트에 I2C 장치에 액세스 할 수 FTDI에서 libmpsse.dll 인터페이스해야합니다

이 예를 생각해 보자.
I2C_GetNumChannels 함수를 호출 할 때 AccessViolation 톤이 발생합니다 ...

dll 함수의 문제점을 알고 싶습니다. 또한 I2C_GetNumChannels 반품에이 개 값을 가정한다

... 여기 공식 API 가이드에서

enter image description here

-

>http://www.ftdichip.com/Support/Documents/AppNotes/AN_177_User_Guide_For_LibMPSSE-I2C.pdf 대단히 감사합니다!

감사합니다.

+1

'numChannels'는'DWORD'가 아니라'DWORD'를 가리키는 포인터입니다. 함수 선언이 잘못되었습니다. –

+0

그에 따라 코드를 수정했습니다 ... 감사합니다! – ELCouz

답변

3

번역이 잘못되었습니다. 다음과 같아야합니다.

function I2C_GetNumChannels(out numChannels: Longword): FT_Result; 
    stdcall; external 'libmpsse.dll'; 

호출하는 함수는 32 비트 부호없는 정수의 주소를 허용합니다. 귀하의 번역은 값으로 32 비트 부호없는 정수를 전달했습니다.

포인터를 사용하여 가져 오기를 변환 할 수는 있지만 발신자가 var 또는 out 매개 변수를 사용하면 쉽게 가져올 수 있습니다.

호출 규칙이 stdcall임을 올바르게 가정했다고 가정합니다. 확실히 알기 위해서는 헤더 파일을 확인해야합니다.

오류에 대해서는 함수 호출에서 반환 된 값을 확인해야합니다. 이것은 외부 라이브러리를 호출 할 때 사람들이 자주 범하는 실수 중 하나입니다. 반환 값을 무시하지 마십시오. 오류를 확인하십시오.

+0

당신이 옳습니다! 감사합니다 각하 CDECL로 전환 (stdcall은 액세스 위반을 만들었습니다) – ELCouz

+0

function I2C_GetNumChannels (out numChannels : Longword) : FT_Result; cdecl; 외부 'libmpsse.dll'; 정답은 – ELCouz

+0

정확할 수도 있지만 시행 착오를 사용하지 마십시오. 헤더 파일을 체크인하십시오. –