2010-04-01 2 views
4

C++ 헤더 파일을 Delphi로 변환하는 데 도움이 필요합니다.DVP7010B 비디오 카드 DLL 용 C++ 헤더의 델파이 변환?

아래는 원래 헤더 파일과 델파이 번역입니다.

C의 ++ 헤더 :

#if _MSC_VER > 1000 
#pragma once 
#endif // _MSC_VER > 1000 

#ifdef DVP7010BDLL_EXPORTS 
#define DVP7010BDLL_API __declspec(dllexport) 
#else 
#define DVP7010BDLL_API __declspec(dllimport) 
#endif 

#define MAXBOARDS 4 
#define MAXDEVS 4 
#define ID_NEW_FRAME 37810 
#define ID_MUX0_NEW_FRAME 37800 
#define ID_MUX1_NEW_FRAME 37801 
#define ID_MUX2_NEW_FRAME 37802 
#define ID_MUX3_NEW_FRAME 37803 

typedef enum { 
    SUCCEEDED = 1, 
    FAILED = 0, 
    SDKINITFAILED = -1, 
    PARAMERROR = -2, 
    NODEVICES = -3, 
    NOSAMPLE = -4, 
    DEVICENUMERROR = -5, 
    INPUTERROR = -6, 
// VERIFYHWERROR = -7 
} 

Res; 

typedef enum tagAnalogVideoFormat { 
    Video_None = 0x00000000, 
    Video_NTSC_M = 0x00000001, 
    Video_NTSC_M_J = 0x00000002, 
    Video_PAL_B = 0x00000010, 
    Video_PAL_M = 0x00000200, 
    Video_PAL_N = 0x00000400, 
    Video_SECAM_B = 0x00001000 
} 

AnalogVideoFormat; 

typedef enum { 
    SIZEFULLPAL=0, 
    SIZED1, 
    SIZEVGA, 
    SIZEQVGA, 
    SIZESUBQVGA 
} 

VideoSize; 

typedef enum { 
    STOPPED = 1, 
    RUNNING = 2, 
    UNINITIALIZED = -1, 
    UNKNOWNSTATE = -2 
} 

CapState; 

class IDVP7010BDLL { 
    public: 
    int AdvDVP_CreateSDKInstence(void **pp); 
    virtual int AdvDVP_InitSDK() PURE; 
    virtual int AdvDVP_CloseSDK() PURE; 
    virtual int AdvDVP_GetNoOfDevices(int *pNoOfDevs) PURE; 
    virtual int AdvDVP_Start(int nDevNum, int SwitchingChans, HWND Main, 
     HWND hwndPreview) PURE; 
    virtual int AdvDVP_Stop(int nDevNum) PURE; 
    virtual int AdvDVP_GetCapState(int nDevNum) PURE; 
    virtual int AdvDVP_IsVideoPresent(int nDevNum, BOOL* VPresent) PURE; 
    virtual int AdvDVP_GetCurFrameBuffer(int nDevNum, int VMux, 
     long* bufSize, BYTE* buf) PURE; 
    virtual int AdvDVP_SetNewFrameCallback(int nDevNum, int callback) PURE; 
    virtual int AdvDVP_GetVideoFormat(int nDevNum, AnalogVideoFormat* vFormat) PURE; 
    virtual int AdvDVP_SetVideoFormat(int nDevNum, AnalogVideoFormat vFormat) PURE; 
    virtual int AdvDVP_GetFrameRate(int nDevNum, int *nFrameRate) PURE; 
    virtual int AdvDVP_SetFrameRate(int nDevNum, int SwitchingChans, 
     int nFrameRate) PURE; 
    virtual int AdvDVP_GetResolution(int nDevNum, VideoSize *Size) PURE; 
    virtual int AdvDVP_SetResolution(int nDevNum, VideoSize Size) PURE; 
    virtual int AdvDVP_GetVideoInput(int nDevNum, int* input) PURE; 
    virtual int AdvDVP_SetVideoInput(int nDevNum, int input) PURE; 
    virtual int AdvDVP_GetBrightness(int nDevNum, int input, long *pnValue) PURE; 
    virtual int AdvDVP_SetBrightness(int nDevNum, int input, long nValue) PURE; 
    virtual int AdvDVP_GetContrast(int nDevNum, int input, long *pnValue) PURE; 
    virtual int AdvDVP_SetContrast(int nDevNum, int input, long nValue) PURE; 
    virtual int AdvDVP_GetHue(int nDevNum, int input, long *pnValue) PURE; 
    virtual int AdvDVP_SetHue(int nDevNum, int input, long nValue) PURE; 
    virtual int AdvDVP_GetSaturation(int nDevNum, int input, long *pnValue) PURE; 
    virtual int AdvDVP_SetSaturation(int nDevNum, int input, long nValue) PURE; 
    virtual int AdvDVP_GPIOGetData(int nDevNum, int DINum, BOOL* value) PURE; 
    virtual int AdvDVP_GPIOSetData(int nDevNum, int DONum, BOOL value) PURE; 
}; 

델파이 :

unit IDVP7010BDLL_h; 

interface 

uses 
    Windows, Messages, SysUtils, Classes; 

//{$if _MSC_VER > 1000} 
//pragma once 
//{$endif} // _MSC_VER > 1000 

{$ifdef DVP7010BDLL_EXPORTS} 
//const DVP7010BDLL_API = __declspec(dllexport); 
{$else} 
//const DVP7010BDLL_API = __declspec(dllimport); 
{$endif} 

const 
    MAXDEVS = 4; 
    MAXMUXS = 4; 
    ID_NEW_FRAME = 37810; 
    ID_MUX0_NEW_FRAME = 37800; 
    ID_MUX1_NEW_FRAME = 37801; 
    ID_MUX2_NEW_FRAME = 37802; 
    ID_MUX3_NEW_FRAME = 37803; 

    // TRec 
    SUCCEEDED = 1; 
    FAILED = 0; 
    SDKINITFAILED = -1; 
    PARAMERROR = -2; 
    NODEVICES = -3; 
    NOSAMPLE = -4; 
    DEVICENUMERROR = -5; 
    INPUTERROR = -6; 
    // TRec 

    // TAnalogVideoFormat 
    Video_None = $00000000; 
    Video_NTSC_M = $00000001; 
    Video_NTSC_M_J = $00000002; 
    Video_PAL_B = $00000010; 
    Video_PAL_M = $00000200; 
    Video_PAL_N = $00000400; 
    Video_SECAM_B = $00001000; 
    // TAnalogVideoFormat 

    // TCapState 
    STOPPED = 1; 
    RUNNING = 2; 
    UNINITIALIZED = -1; 
    UNKNOWNSTATE = -2; 
    // TCapState 

type 
    TCapState = Longint; 
    TRes = Longint; 
    TtagAnalogVideoFormat = DWORD; 
    TAnalogVideoFormat = TtagAnalogVideoFormat; 
    PAnalogVideoFormat = ^TAnalogVideoFormat; 
    TVideoSize = ( SIZEFULLPAL, SIZED1, SIZEVGA, SIZEQVGA, SIZESUBQVGA); 
    PVideoSize = ^TVideoSize; 
    P_Pointer = ^Pointer; 

    TIDVP7010BDLL = class 
     function AdvDVP_CreateSDKInstence(pp: P_Pointer): integer; virtual; stdcall; 
      abstract; 
     function AdvDVP_InitSDK():Integer; virtual; stdcall; abstract; 
     function AdvDVP_CloseSDK():Integer; virtual; stdcall; abstract; 
     function AdvDVP_GetNoOfDevices(pNoOfDevs : PInteger) :Integer; virtual; stdcall; 
      abstract; 
     function AdvDVP_Start(nDevNum : Integer; SwitchingChans : Integer; Main : HWND; 
      hwndPreview: HWND) :Integer; virtual; stdcall; abstract; 
     function AdvDVP_Stop(nDevNum : Integer):Integer; virtual; stdcall; abstract; 
     function AdvDVP_GetCapState(nDevNum : Integer):Integer; virtual; stdcall; 
      abstract; 
     function AdvDVP_IsVideoPresent(nDevNum : Integer; VPresent : PBool) :Integer; 
      virtual; stdcall; abstract; 
     function AdvDVP_GetCurFrameBuffer(nDevNum : Integer; VMux : Integer; bufSize : 
      PLongInt; buf : PByte) :Integer; virtual; stdcall; abstract; 
     function AdvDVP_SetNewFrameCallback(nDevNum : Integer; callback : Integer) 
      :Integer; virtual; stdcall; abstract; 
     function AdvDVP_GetVideoFormat(nDevNum : Integer; vFormat : PAnalogVideoFormat) 
      :Integer; virtual; stdcall; abstract; 
     function AdvDVP_SetVideoFormat(nDevNum : Integer; vFormat : TAnalogVideoFormat) 
      :Integer; virtual; stdcall; abstract; 
     function AdvDVP_GetFrameRate(nDevNum : Integer; nFrameRate : Integer) :Integer; 
      virtual; stdcall; abstract; 
     function AdvDVP_SetFrameRate(nDevNum : Integer; SwitchingChans : Integer; 
      nFrameRate : Integer) :Integer; virtual; stdcall; abstract; 
     function AdvDVP_GetResolution(nDevNum : Integer; Size : PVideoSize) :Integer; 
      virtual; stdcall; abstract; 
     function AdvDVP_SetResolution(nDevNum : Integer; Size : TVideoSize) :Integer; 
      virtual; stdcall; abstract; 
     function AdvDVP_GetVideoInput(nDevNum : Integer; input : PInteger) :Integer; 
      virtual; stdcall; abstract; 
     function AdvDVP_SetVideoInput(nDevNum : Integer; input : Integer) :Integer; 
      virtual; stdcall; abstract; 
     function AdvDVP_GetBrightness(nDevNum : Integer; input: Integer; pnValue : 
      PLongInt) :Integer; virtual; stdcall; abstract; 
     function AdvDVP_SetBrightness(nDevNum : Integer; input: Integer; nValue : 
      LongInt) :Integer; virtual; stdcall; abstract; 
     function AdvDVP_GetContrast(nDevNum : Integer; input: Integer; pnValue : 
      PLongInt) :Integer; virtual; stdcall; abstract; 
     function AdvDVP_SetContrast(nDevNum : Integer; input: Integer; nValue : 
      LongInt) :Integer; virtual; stdcall; abstract; 
     function AdvDVP_GetHue(nDevNum : Integer; input: Integer; pnValue : 
      PLongInt):Integer; virtual; stdcall; abstract; 
     function AdvDVP_SetHue(nDevNum : Integer; input: Integer; nValue : 
      LongInt):Integer; virtual; stdcall; abstract; 
     function AdvDVP_GetSaturation(nDevNum : Integer; input: Integer; pnValue : 
      PLongInt) :Integer; virtual; stdcall; abstract; 
     function AdvDVP_SetSaturation(nDevNum : Integer; input: Integer; nValue : 
      LongInt) :Integer; virtual; stdcall; abstract; 
     function AdvDVP_GPIOGetData(nDevNum : Integer; DINum:Integer; value : 
      PBool):Integer; virtual; stdcall; abstract; 
     function AdvDVP_GPIOSetData(nDevNum : Integer; DONum:Integer; value : 
      Boolean):Integer; virtual; stdcall; abstract; 
    end; 

    function IDVP7010BDLL : TIDVP7010BDLL ; stdcall; 


implementation 


function IDVP7010BDLL; external 'DVP7010B.dll'; 

end. 

사회가 제대로 내 데이터를 변환 나를 ​​도와 또는 나이 어떻게 할 보여 가이드에 직접 수 있습니까?

+1

무엇이 질문입니까? 이 문제가 어디에서 발생 했습니까? 컴파일되지 않습니까? 기능 중 하나가 제대로 작동하지 않습니까? 그것을 시도 할 때 잘못하고있는 것은 무엇입니까? –

+0

2 개의 별도 코드 블록으로 분리 할 수 ​​있습니까? 아마도 "내 델파이 번역입니다."와 같은 것을 추가 할 수 있습니까? – SamB

+0

@SamB : 완료. 그리고 한계를 넘어서는 문자가 더 많습니다 .... –

답변

1

글쎄, 가장 먼저 주목해야 할 것은 C++ 클래스를 Delphi 클래스로 변환하려고한다는 것입니다. 너는 그렇게 할 수 없다. 객체 모델은 매우 다릅니다. 델파이는 객체가 배치되는 방식, 특히 객체의 VMT가 배치되는 방식에 대해 특정 가정을 할 것입니다. 이것은 C++이 아니라 델파이에서만 유효합니다.

비 객체 지향 인터페이스 (일반 C) 또는 COM 객체가 필요합니다.

+0

어드밴텍 DVP7010B 비디오 카드 (http://www.advantech.com/products/DVP-7010BE/mod_1-2JKF46.aspx)를 연결해야합니다. 이 카드에는 C++ 용 샘플 만 있습니다. Delphi에서이 카드에 dll을 사용하는 방법을 모르겠습니다. 나는 델파이로 번역 dll 헤더 파일을 만드는 것에 대해 많은 것을 읽었지만 내 결과 onlu는 액세스 위반을합니다. 아무도 내가 적절한 파일을 얻으려면 어떻게해야합니까? – user307225

+1

C++ 클래스는 DLL 경계를 넘지 않습니다 (어쨌든 이동 가능). 해당 DLL을 사용하려면 C API를 찾아야합니다. –

+0

이것은이 카드를 Delphi에서 사용할 가능성이 없다는 것을 의미합니까? 제조업체는 위와 같이 헤더 파일 만 제공합니다. – user307225

1

분명히 AdvDVP_CreateSDKInstence는 가상 기능 호출을 디스패치하는 데 사용되는 VMT를 만들기 위해 Magic (tm)을 만듭니다.

원하는 경우 C++ 헤더 파일과 프로그램을 DLL에 그대로두고 델파이 클래스로 래핑해야합니다. 당신이 선택할 수있는 튜토리얼 톤이 있습니다. 우선, this one을 시도해보십시오. 또한 Delphi에서 열거 형을 만드는 방법을 보여 주며 DLL에서 내보내는 함수에서 단위를 만드는 간단한 도구가 있습니다.

+0

나는이 토탈과 더 많은 것을 읽었지만 문제를 해결하는 방법을 모른다. Rudy의 Delphi Corner (Delphi에서 C++ 객체 사용)의 도움으로 문제를 해결하려했지만 성공하지 못했습니다. 샘플을 몇 줄 줄래요? – user307225

+1

@ grzegorz1 : 질문을 편집하고 튜토리얼 중 하나를 따르고 나면 유닛을 게시하고 컴파일하거나 실행할 때 발생하는 오류를 게시하십시오. – Ozan

3

나는
여기에 첫 번째 목적은 작업 라이브러리 함수를 호출하는 것입니다 (당신이 래퍼를 구축하고 테스트 할 때 적어도 처음에) 당신이 클래스 를 사용해서는 안 메이슨에 동의합니다. 그것은 불완전한 전환, 그리고 내가 하나 개의 단위로 모두 넣어

unit Unit1; 

interface 

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

type 
    TForm1 = class(TForm) 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
    public 
    procedure DisplayStatus(r:integer); 
    end; 

    Function AdvDVP_InitSDK():Integer ; stdcall; external 'DVP7010B.dll'; 

var 
    Form1: TForm1; 
    DVP_DLL_Handle:THandle; 

const 
    SUCCEEDED = 1; 
    FAILED = 0; 
    SDKINITFAILED = -1; 
    PARAMERROR = -2; 
    NODEVICES = -3; 
    NOSAMPLE = -4; 
    DEVICENUMERROR = -5; 
    INPUTERROR = -6; 

implementation 

{$R *.dfm} 

procedure TForm1.Button1Click(Sender: TObject); 
var r:integer; 
begin 
    if DVP_DLL_Handle <>0 then begin 
     r := AdvDVP_InitSDK(); 
     DisplayStatus(r); 
    end else begin 
    showmessage('error loading library'); 
    end; 
end; 

procedure TForm1.DisplayStatus(r: integer); 
begin 
    case r of 
    SUCCEEDED:showmessage('SUCCEEDED'); 
    FAILED:showmessage('FAILED'); 
    SDKINITFAILED:showmessage('SDKINITFAILED'); 
    PARAMERROR:showmessage('PARAMERROR'); 
    NODEVICES:showmessage('NODEVICES'); 
    NOSAMPLE:showmessage('NOSAMPLE'); 
    DEVICENUMERROR:showmessage('DEVICENUMERROR'); 
    INPUTERROR:showmessage('INPUTERROR'); 
    end; 
end; 

initialization 
    DVP_DLL_Handle:=LoadLibrary('DVP7010B.dll'); 

finalization 
    if DVP_DLL_Handle <>0 then begin 
    FreeLibrary(DVP_DLL_Handle); 
    end; 

end. 

을 ...

하지만 난 SDK를 다운로드하고 그것을 시도 :

때문에이 같은 시도 그것이 작동합니다 : 내가 버튼을 누르면 'NODEVICES'가 나옵니다.

+0

불행히도 귀하의 솔루션은 실제 카드로 작동하지 않습니다. AdvDVP_InitSDK 함수는 액세스 위반을 발생시킵니다. 도와 줘서 고마워. – user307225

+1

당신은 dll 의존성을 확인해야합니다 ... 예를 들면 :이 DLL에는 실제로 Microsoft Visual C++ 2005 재배포 가능 패키지가 설치되어 있어야하기 때문에 이전에는 비슷한 문제가 Delphi 및 SketchupReader.dll (액세스 위반)으로 재생되었습니다. – DamienD

0
unit IDVP7010BDLL_h; 

interface 

uses 
    Windows; 

const 
    DVP7010B   = 'DVP7010B.dll'; 

    MAXBOARDS   = 4; 
    MAXDEVS   = 4; 
    MAXMUXS   = 4; 
    ID_NEW_FRAME  = 37810; 
    ID_MUX0_NEW_FRAME = 37800; 
    ID_MUX1_NEW_FRAME = 37801; 
    ID_MUX2_NEW_FRAME = 37802; 
    ID_MUX3_NEW_FRAME = 37803; 

    // TRec 
    SUCCEEDED  = 1; 
    FAILED   = 0; 
    SDKINITFAILED = -1; 
    PARAMERROR  = -2; 
    NODEVICES  = -3; 
    NOSAMPLE  = -4; 
    DEVICENUMERROR = -5; 
    INPUTERROR  = -6; 
    // TRec 

    // TAnalogVideoFormat 
    Video_None  = $00000000; 
    Video_NTSC_M = $00000001; 
    Video_NTSC_M_J = $00000002; 
    Video_PAL_B  = $00000010; 
    Video_PAL_M  = $00000200; 
    Video_PAL_N  = $00000400; 
    Video_SECAM_B = $00001000; 
    // TAnalogVideoFormat 

    // TCapState 
    STOPPED  = 1; 
    RUNNING  = 2; 
    UNINITIALIZED = -1; 
    UNKNOWNSTATE = -2; 
    // TCapState 

type 
    TCapState = Longint; 
    TRes = Longint; 
    TtagAnalogVideoFormat = DWORD; 
    TAnalogVideoFormat = TtagAnalogVideoFormat; 
    PAnalogVideoFormat = ^TAnalogVideoFormat; 
    TVideoSize = (SIZEFULLPAL = 0, SIZED1, SIZEVGA, SIZEQVGA, SIZESUBQVGA); 
    PVideoSize = ^TVideoSize; 
    P_Pointer = ^Pointer; 

    //TAdvDVP_CreateSDKInstence = function(var p: PIDVP7010BDLL): Integer of object; stdcall; // not needed in class 
    TAdvDVP_InitSDK = function(): Integer of object; stdcall; 
    TAdvDVP_CloseSDK = function(): Integer of object; stdcall; 
    TAdvDVP_GetNoOfDevices = function(var pNoOfDevs: Integer): Integer of object; stdcall; 
    TAdvDVP_Start = function(nDevNum: Integer; SwitchingChans: Integer; Main: HWND; hwndPreview: HWND): Integer of object; stdcall; 
    TAdvDVP_Stop = function(nDevNum: Integer): Integer of object; stdcall; 
    TAdvDVP_GetCapState = function(nDevNum: Integer): Integer of object; stdcall; 
    TAdvDVP_IsVideoPresent = function(nDevNum: Integer; var VPresent: Bool): Integer of object; stdcall; 
    TAdvDVP_GetCurFrameBuffer = function(nDevNum: Integer; VMux: Integer; var bufSize: LongInt; buf: PByte): Integer of object; stdcall; 
    TAdvDVP_SetNewFrameCallback = function(nDevNum: Integer; callback: Integer): Integer of object; stdcall; 
    TAdvDVP_GetVideoFormat = function(nDevNum: Integer; var vFormat: TAnalogVideoFormat): Integer of object; stdcall; 
    TAdvDVP_SetVideoFormat = function(nDevNum: Integer; vFormat: TAnalogVideoFormat): Integer of object; stdcall; 
    TAdvDVP_GetFrameRate = function(nDevNum: Integer; nFrameRate: Integer): Integer of object; stdcall; 
    TAdvDVP_SetFrameRate = function(nDevNum: Integer; SwitchingChans: Integer; nFrameRate: Integer): Integer of object; stdcall; 
    TAdvDVP_GetResolution = function(nDevNum: Integer; var Size: TVideoSize): Integer of object; stdcall; 
    TAdvDVP_SetResolution = function(nDevNum: Integer; Size: TVideoSize): Integer of object; stdcall; 
    TAdvDVP_GetVideoInput = function(nDevNum: Integer; var input: Integer): Integer of object; stdcall; 
    TAdvDVP_SetVideoInput = function(nDevNum: Integer; input: Integer): Integer of object; stdcall; 
    TAdvDVP_GetBrightness = function(nDevNum: Integer; input: Integer; var pnValue: LongInt) :Integer of object; stdcall; 
    TAdvDVP_SetBrightness = function(nDevNum: Integer; input: Integer; nValue: LongInt) :Integer of object; stdcall; 
    TAdvDVP_GetContrast = function(nDevNum: Integer; input: Integer; var pnValue: LongInt) :Integer of object; stdcall; 
    TAdvDVP_SetContrast = function(nDevNum: Integer; input: Integer; nValue: LongInt) :Integer of object; stdcall; 
    TAdvDVP_GetHue = function(nDevNum: Integer; input: Integer; var pnValue: LongInt) :Integer of object; stdcall; 
    TAdvDVP_SetHue = function(nDevNum: Integer; input: Integer; nValue: LongInt) :Integer of object; stdcall; 
    TAdvDVP_GetSaturation = function(nDevNum: Integer; input: Integer; var pnValue: LongInt) :Integer of object; stdcall; 
    TAdvDVP_SetSaturation = function(nDevNum: Integer; input: Integer; nValue: LongInt) :Integer of object; stdcall; 
    TAdvDVP_GPIOGetData = function(nDevNum: Integer; DINum: Integer; var value: Bool): Integer of object; stdcall; 
    TAdvDVP_GPIOSetData = function(nDevNum: Integer; DONum: Integer; value: Boolean): Integer of object; stdcall; 


    TIDVP7010BDLL = class 
    public 
    //AdvDVP_CreateSDKInstence: TAdvDVP_CreateSDKInstence; // not needed in class 
    AdvDVP_InitSDK: TAdvDVP_InitSDK; 
    AdvDVP_CloseSDK: TAdvDVP_CloseSDK; 
    AdvDVP_GetNoOfDevices: TAdvDVP_GetNoOfDevices; 
    AdvDVP_Start: TAdvDVP_Start; 
    AdvDVP_Stop: TAdvDVP_Stop; 
    AdvDVP_GetCapState: TAdvDVP_GetCapState; 
    AdvDVP_IsVideoPresent: TAdvDVP_IsVideoPresent; 
    AdvDVP_GetCurFrameBuffer: TAdvDVP_GetCurFrameBuffer; 
    AdvDVP_SetNewFrameCallback: TAdvDVP_SetNewFrameCallback; 
    AdvDVP_GetVideoFormat: TAdvDVP_GetVideoFormat; 
    AdvDVP_SetVideoFormat: TAdvDVP_SetVideoFormat; 
    AdvDVP_GetFrameRate: TAdvDVP_GetFrameRate; 
    AdvDVP_SetFrameRate: TAdvDVP_SetFrameRate; 
    AdvDVP_GetResolution: TAdvDVP_GetResolution; 
    AdvDVP_SetResolution: TAdvDVP_SetResolution; 
    AdvDVP_GetVideoInput: TAdvDVP_GetVideoInput; 
    AdvDVP_SetVideoInput: TAdvDVP_SetVideoInput; 
    AdvDVP_GetBrightness: TAdvDVP_GetBrightness; 
    AdvDVP_SetBrightness: TAdvDVP_SetBrightness; 
    AdvDVP_GetContrast: TAdvDVP_GetContrast; 
    AdvDVP_SetContrast: TAdvDVP_SetContrast; 
    AdvDVP_GetHue: TAdvDVP_GetHue; 
    AdvDVP_SetHue: TAdvDVP_SetHue; 
    AdvDVP_GetSaturation: TAdvDVP_GetSaturation; 
    AdvDVP_SetSaturation: TAdvDVP_SetSaturation; 
    AdvDVP_GPIOGetData: TAdvDVP_GPIOGetData; 
    AdvDVP_GPIOSetData: TAdvDVP_GPIOSetData; 

    constructor Create; // For method 2 
    end; 
    PIDVP7010BDLL = ^TIDVP7010BDLL; 
    PPIDVP7010BDLL = ^PIDVP7010BDLL; 

    TIAdvDVP_CreateSDKInstence = function(var p: PIDVP7010BDLL): Integer; stdcall; 

var 
    hDVP7010B: THandle; 
    IAdvDVP_CreateSDKInstence: TIAdvDVP_CreateSDKInstence; 

implementation 

{ TIDVP7010BDLL } 

constructor TIDVP7010BDLL.Create; 
begin 
    if hDVP7010B <> 0 then 
    begin 
    //@IAdvDVP_CreateSDKInstence := GetProcAddress(hDVP7010B, 'AdvDVP_CreateSDKInstence'); // not needed 
    @AdvDVP_InitSDK := GetProcAddress(hDVP7010B, 'AdvDVP_InitSDK'); 
    @AdvDVP_CloseSDK := GetProcAddress(hDVP7010B, 'AdvDVP_CloseSDK'); 
    @AdvDVP_GetNoOfDevices := GetProcAddress(hDVP7010B, 'AdvDVP_GetNoOfDevices'); 
    @AdvDVP_Start := GetProcAddress(hDVP7010B, 'AdvDVP_Start'); 
    @AdvDVP_Stop := GetProcAddress(hDVP7010B, 'AdvDVP_Stop'); 
    @AdvDVP_GetCapState := GetProcAddress(hDVP7010B, 'AdvDVP_GetCapState'); 
    @AdvDVP_IsVideoPresent := GetProcAddress(hDVP7010B, 'AdvDVP_IsVideoPresent'); 
    @AdvDVP_GetCurFrameBuffer := GetProcAddress(hDVP7010B, 'AdvDVP_GetCurFrameBuffer'); 
    @AdvDVP_SetNewFrameCallback := GetProcAddress(hDVP7010B, 'AdvDVP_SetNewFrameCallback'); 
    @AdvDVP_GetVideoFormat := GetProcAddress(hDVP7010B, 'AdvDVP_GetVideoFormat'); 
    @AdvDVP_SetVideoFormat := GetProcAddress(hDVP7010B, 'AdvDVP_SetVideoFormat'); 
    @AdvDVP_GetFrameRate := GetProcAddress(hDVP7010B, 'AdvDVP_GetFrameRate'); 
    @AdvDVP_SetFrameRate := GetProcAddress(hDVP7010B, 'AdvDVP_SetFrameRate'); 
    @AdvDVP_GetResolution := GetProcAddress(hDVP7010B, 'AdvDVP_GetResolution'); 
    @AdvDVP_SetResolution := GetProcAddress(hDVP7010B, 'AdvDVP_SetResolution'); 
    @AdvDVP_GetVideoInput := GetProcAddress(hDVP7010B, 'AdvDVP_GetVideoInput'); 
    @AdvDVP_SetVideoInput := GetProcAddress(hDVP7010B, 'AdvDVP_SetVideoInput'); 
    @AdvDVP_GetBrightness := GetProcAddress(hDVP7010B, 'AdvDVP_GetBrightness'); 
    @AdvDVP_SetBrightness := GetProcAddress(hDVP7010B, 'AdvDVP_SetBrightness'); 
    @AdvDVP_GetContrast := GetProcAddress(hDVP7010B, 'AdvDVP_GetContrast'); 
    @AdvDVP_SetContrast := GetProcAddress(hDVP7010B, 'AdvDVP_SetContrast'); 
    @AdvDVP_GetHue := GetProcAddress(hDVP7010B, 'AdvDVP_GetHue'); 
    @AdvDVP_SetHue := GetProcAddress(hDVP7010B, 'AdvDVP_SetHue'); 
    @AdvDVP_GetSaturation := GetProcAddress(hDVP7010B, 'AdvDVP_GetSaturation'); 
    @AdvDVP_SetSaturation := GetProcAddress(hDVP7010B, 'AdvDVP_SetSaturation'); 
    @AdvDVP_GPIOGetData := GetProcAddress(hDVP7010B, 'AdvDVP_GPIOGetData'); 
    @AdvDVP_GPIOSetData := GetProcAddress(hDVP7010B, 'AdvDVP_GPIOSetData'); 
    end 
    else 
    MessageBox(0, 'DVP7010B.dll not found!', 'Error', MB_ICONERROR); 
end; 

initialization 
    hDVP7010B := LoadLibrary(DVP7010B); 
    // For method 1 
    if hDVP7010B <> 0 then 
    begin 
    @IAdvDVP_CreateSDKInstence := GetProcAddress(hDVP7010B, 'AdvDVP_CreateSDKInstence'); 
    if @IAdvDVP_CreateSDKInstence = nil then 
     MessageBox(0, 'AdvDVP_CreateSDKInstence not found in DVP7010B.dll', 'Error', MB_ICONERROR); 
    end 
    else 
    MessageBox(0, 'DVP7010B.dll not found!', 'Error', MB_ICONERROR); 

finalization 
    FreeLibrary(hDVP7010B); 

end. 

테스트 코드 :

procedure TForm8.Button1Click(Sender: TObject); 
var 
    pDVPSDK: PIDVP7010BDLL; 
    res: Integer; 
begin 
    // Method 1 
    pDVPSDK := nil; 
    res := IAdvDVP_CreateSDKInstence(pDVPSDK); 
    if not (res = SUCCEEDED) then 
    begin 
    Application.MessageBox('AdvDVP_CreateSDKInstence error!', 'Error', MB_ICONERROR); 
    end 
    else 
    begin 
    Application.MessageBox('AdvDVP_CreateSDKInstence will not work for this!!!', 'Error', MB_ICONERROR); 
    end; 
end; 

는 델파이와 함께 작동하지 않습니다 이유 : 는 빈 델파이 2009 클래스는 8 바이트 (추가 정보를 원하시면 http://blogs.teamb.com/craigstuntz/2009/03/25/38138/ 참조) 등 AdvDVP_InitSDK & AdvDVP_CloseSDK가 먹고 얻을 오프셋을 가지고 버그 나머지 기능과 내 버그도 클래스 자체 버그.

디버깅하는 동안 지역 변수를 살펴 보자 :

  • pDVPSDK $ 1C71100
  • + AdvDVP_InitSDK ($ 10,001,253, $ 1000123A)
  • + AdvDVP_CloseSDK ($ 1000101E, $ 1천만1천2백85를)
  • + AdvDVP_GetNoOfDevices ($ 100011D1, $ 1000112C)
  • + ....

그리고 IDA에서 17,451,515,:

는 .text : TAdvDVP_GetNoOfDevices에 10001253 공공 AdvDVP_GetNoOfDevices

AdvDVP_InitSDK 포인트! 당신이 카드를 자신이있는 경우

이 시도 :

procedure TForm8.Button2Click(Sender: TObject); 
var 
    DVPSDK: TIDVP7010BDLL; 
    res: Integer; 
    nDevCount: Integer; 
    i: Integer; 
begin 
    // Method 2 
    DVPSDK := TIDVP7010BDLL.Create; 
    try 
    res := DVPSDK.AdvDVP_InitSDK; 
    if res = SUCCEEDED then 
    begin 
     if not (DVPSDK.AdvDVP_GetNoOfDevices(nDevCount) = SUCCEEDED) then 
     Exit; 

     if (nDevCount > MAXBOARDS*MAXDEVS) then 
     Exit; 

     for i := 0 to nDevCount - 1 do 
     begin 
     m_DevNum.Items.Add(Format('Device_%d', [i])); // TComboBox 
     end; 
    end 
    else 
    begin 
     case res of 
     FAILED: Application.MessageBox('SDK function failed!', 'Error', MB_ICONERROR); 
     SDKINITFAILED: Application.MessageBox('SDK initiation failed!', 'Error', MB_ICONERROR); 
     PARAMERROR: Application.MessageBox('Number of the devices out of the range!', 'Error', MB_ICONERROR); 
     NODEVICES: Application.MessageBox('No device be found!', 'Error', MB_ICONERROR); 
     end; 
    end; 
    finally 
    DVPSDK.Free; 
    end; 
end; 

이벤트가 stdcall을 이외의 다른 통화 변환을 필요로하는 경우 나도 몰라,하지만 당신은 cdecl을 다른 사람들이 당신이 무엇을 얻을 데이터를 따라 함께 시도 할 수 있습니다 함수에서.

행운을 빈다.

+0

불행히도, 귀하의 도움에도 불구하고, 우리는 여전히 성공을 거두지 못했습니다. "AdvDVP_InitSDK"함수를 호출하면 액세스 위반이 생성됩니다. 지난 밤에 저는 TVideoGrabber 구성 요소와 카드를 연결하려고했습니다. 완벽하게 작동합니다. 그래서 아마 싸움을 포기할 것입니다. 다시 한 번 도움을 주셔서 대단히 감사합니다. – user307225