将DLL调用从PowerBasic转换为Delphi

时间:2017-09-28 18:46:11

标签: delphi dll spss

我想打电话给SPSS'后端'来自德尔福。我可以使用一个DLL(似乎):SPSSio64.DLL。但我找不到界面定义。

我发现的是PowerBasic中的一个例子:

Read and write SPSS sav files

DECLARE FUNCTION spssOpenRead LIB "spssio32.dll" ALIAS "spssOpenRead@8" (BYVAL fileName AS STRING, BYREF hHandle AS LONG) AS LONG
DECLARE FUNCTION spssCloseRead LIB "spssio32.dll" ALIAS "spssCloseRead@4" (BYVAL hHandle AS LONG) AS LONG

由于我只需要函数来读取和写入文件(所有处理都将通过该文件中的语法完成),我认为这个例子可能足以推断出如何从Delphi中调用等效函数。

所以问题是:这些声明如何在Delphi(64位)中?

2 个答案:

答案 0 :(得分:0)

根据SPSS 14.0 for Windows Developer's GuidePowerBasic documentation,尝试以下内容:

32位:

// spssio32.dll exports both 'spssOpenRead' and 'spssOpenRead@8', which are the same function...
function spssOpenRead(filename: PAnsiChar; var hHandle: Integer): Integer; stdcall; external 'spssio32.dll' {name 'spssOpenRead@8'};

// spssio32.dll exports both 'spssCloseRead' and 'spssCloseRead@4', which are the same function...
function spssCloseRead(hHandle: Integer): Integer; stdcall; external 'spssio32.dll' {name 'spssCloseRead@4'};

64位:

// I can't find a copy of spssio64.dll to download, so I can't verify the exported names. Adjust if needed..

function spssOpenRead(filename: PAnsiChar; var hHandle: Integer): Integer; stdcall; external 'spssio64.dll' {name 'spssOpenRead@16'};

function spssCloseRead(hHandle: Integer): Integer; stdcall; external 'spssio64.dll' {name 'spssCloseRead@8'};

答案 1 :(得分:0)

对于记录,这有效:

function LoadDLL(DLLname : string) : Uint64;
var
  em : TArithmeticExceptionMask;
begin
  em:=GetExceptionmask;
  SetExceptionmask(em+[exInvalidOp,exZeroDivide,exOverflow,exUnderflow]);
  result:=LoadLibrary(PwideChar(DLLname));
  SetExceptionmask(em);
end;

function RunSPSSio(filename : string; instructions : Tinstructions) : boolean;
// This will only read SAV files, not SPS files !
type
  TspssOpenRead             = function (filename: PAnsiChar; var hHandle: Uint64): Integer;
  TspssCloseRead            = function(hHandle: Uint64): Integer;
  TspssGetInterfaceEncoding = function(hHandle : Uint64): Integer;
  TspssSetInterfaceEncoding = function(encoding : integer; hHandle : Uint64): Integer;
const
  SPSS_ENCODING_UTF8     = 1;
var
  p                      : integer;
  spssOpenRead           : TspssOpenRead;
  spssCloseRead          : TspssCloseRead;
  spssGetIFencoding      : TspssGetInterfaceEncoding;
  spssSetIFencoding      : TspssSetInterfaceEncoding;
  DLLhandle              : Uint64;
  fileref                : PANSIchar;
begin
  result:=false;
  DLLhandle:=LoadDLL('C:\SPSS\spssio64.dll'); // hardcoded
  if DLLhandle=0
     then begin p:=GetLastError();
                report('DLL load error '+IntToStr(p));
                exit;
          end;
  try
    @SPSSopenRead:=getProcAddress(DLLhandle,'spssOpenRead');
    @SPSScloseRead:=getProcAddress(DLLhandle,'spssCloseRead');

    @SPSSsetIFencoding:=getProcAddress(DLLhandle,'spssSetInterfaceEncoding');
    SPSSsetIFencoding(SPSS_ENCODING_UTF8,DLLhandle);

    fileref:=PANSIchar(ANSIstring(filename));
    p:=SPSSopenRead(fileref,DLLhandle);
    if p<>0
       then report('*** SPSSio error '+IntToStr(p))
       else begin // SPSS database interactions here
                  result:=SPSScloseRead(DLLhandle)=0;
            end;
  finally
    freeLibrary(DLLhandle);
  end;
end;