Delphi XE4 E2010不兼容类型:'Cardinal'和'Pointer'

时间:2013-09-01 07:13:11

标签: database delphi dll anydac firedac

您好我试图在delphi xe4下编译firedac dll开发示例,它出现了以下错误

[dcc32 Error] Unit1.pas(61): E2010 Incompatible types: 'Cardinal' and 'Pointer'

我已经在代码中标记了错误。

单元1是可执行文件。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, uADStanIntf, uADStanOption, uADStanDef, uADPhysIntf,
  uADDatSManager, uADStanParam, uADDAptIntf, StdCtrls, Grids, DBGrids,
  DB, uADPhysManager, uADPhysMSAcc, uADGUIxFormsWait, uADCompGUIx, uADCompDataSet,
  uADCompClient, uADStanError, uADGUIxIntf, uADStanPool, uADStanAsync,
  uADDAptManager, uADPhysODBCBase;

type
  TShowDataProc = procedure (ACliHandle: LongWord); stdcall;
  TShutdownProc = procedure; stdcall;

  TForm1 = class(TForm)
    ADConnection1: TADConnection;
    ADQuery1: TADQuery;
    ADGUIxWaitCursor1: TADGUIxWaitCursor;
    ADPhysMSAccessDriverLink1: TADPhysMSAccessDriverLink;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    FhDll: THandle;
    FpShowData: TShowDataProc;
    FpShutdown: TShutdownProc;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  uADStanUtil;

procedure TForm1.Button1Click(Sender: TObject);
begin
  FhDll := LoadLibrary(PChar('Project2.dll'));
  if FhDll = 0 then
    raise Exception.Create(ADLastSystemErrorMsg);
  @FpShowData := GetProcAddress(FhDll, PChar('ShowData'));
  if not Assigned(FpShowData) then
    raise Exception.Create(ADLastSystemErrorMsg);
  @FpShutdown := GetProcAddress(FhDll, PChar('Shutdown'));
  if not Assigned(FpShutdown) then
    raise Exception.Create(ADLastSystemErrorMsg);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  FpShowData(ADConnection1.CliHandle);   << Error is here
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  FpShutdown();
  FreeLibrary(FhDll);
  FhDll := 0;
  @FpShowData := nil;
  @FpShutdown := nil;
end;

end.

Unit2是dll

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, uADStanIntf, uADStanOption, uADStanDef, uADPhysIntf,
  uADDatSManager, uADStanParam, uADDAptIntf, Grids, DBGrids, DB,
  uADPhysManager, uADPhysMSAcc, uADGUIxFormsWait, uADCompGUIx, uADCompDataSet,
  uADCompClient, uADStanError, uADGUIxIntf, uADStanPool, uADStanAsync,
  uADDAptManager, uADPhysODBCBase;

type
  TForm2 = class(TForm)
    ADConnection1: TADConnection;
    ADQuery1: TADQuery;
    ADGUIxWaitCursor1: TADGUIxWaitCursor;
    ADPhysMSAccessDriverLink1: TADPhysMSAccessDriverLink;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
  public
    class procedure ShowData(ACliHandle: LongWord);
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

{ TForm2 }

class procedure TForm2.ShowData(ACliHandle: LongWord);
var
  oForm: TForm2;
begin
  oForm := TForm2.Create(Application);
  oForm.ADConnection1.SharedCliHandle := ACliHandle;  <<<<<<<<<Error Here
  oForm.ADConnection1.Connected := True;
  oForm.ADQuery1.Active := True;
  oForm.Show;
end;

end.

1 个答案:

答案 0 :(得分:3)

http://docs.embarcadero.com/products/rad_studio/firedac/frames.html?frmname=topic&frmfile=uADCompClient_TADCustomConnection_SharedCliHandle.html

正如您所看到的,SharedCliHandle是指针,所以可能示例是旧的,您需要将LongWord更改为指针。为什么LongWord早先和指针现在我们只能猜测,我的猜测我作为评论分享。