0

「x.dll」から関数をロードしたいのですが、関数(.hファイル)の定義は次のとおりです。

uint32 BioAPI_ModuleAttach(
    const BioAPI_UUID *ModuleGuid,
    const BioAPI_VERSION *Version,
    const BioAPI_MEMORY_FUNCS *MemoryFuncs,
    uint32 DeviceID,
    uint32 Reserved1,
    uint32 Reserved2,
    uint32 Reserved3,
    BioAPI_FUNC_NAME_ADDR *FunctionTable,
    uint32 NumFunctionTable,
    const void *Reserved4,
    BioAPI_HANDLE_PTR NewModuleHandle);

typedef uint32 BioAPI_HANDLE, *BioAPI_HANDLE_PTR;

しかし、私は最後のパラメーターと渡したい他のパラメーター0(null)のみを渡します...どうすれば実装できますか?de .libで自動化する方法はありますか?

試しましたが、間違った方法で実装しました。.:\

function BioAPI_ModuleAttach(
           ModuleGuid: array of Byte; 
           Version: HWND; 
           MemoryFuncs: HWND; 
           DeviceID: UInt32; 
           Reserved1: UInt32; 
           Reserved2: UInt32; 
           Reserved3: UInt32; 
           FunctionTable: HWND; 
           NumFunctionTable: UInt32; 
           Reserved4: Pointer; 
           NewModuleHandle: PINT) : UInt32; cdecl; external 'PvFw.dll';

ご清聴ありがとうございました。

4

3 に答える 3

2

私はこれがうまくいくと思います:

function BioAPI_ModuleAttach(
  ModuleGuid: PByte; // pass a pointer to the first array element
  Version: PByte;    // PByte probably is wrong here, look up the type!
  MemoryFuncs: PByte; // Also probably wrong, what is BioAPI_MEMORY_FUNCS?
  DeviceID: UInt32; 
  Reserved1: UInt32; 
  Reserved2: UInt32; 
  Reserved3: UInt32; 
  FunctionTable: PBYTE; // pass a pointer to a BioAPI_FUNC_NAME_ADDR 
  NumFunctionTable: UInt32; // that's probably the length of the above
  Reserved4: Pointer; 
  NewModuleHandle: PUINT32) : UInt32; cdecl; external 'PvFw.dll';

すべてのパラメーターがゼロまたはNULLになる可能性がある場合は、このように呼び出すと機能するはずです。

var
  DeviceId: UInt32; // LongWord
  Handle: UInt32; // LongWord;
begin
  DeviceId := <something>
  Handle := 0;
  Res := BioAPI_ModuleAttach(nil, nil, nil, DeviceId, 0, 0, 0, nil, 0, nil, @Handle);

もちろん、ポインタパラメータの多くに関する情報を提供しなかったため、これは多くのことを前提としています。私はそれらをPByteとして宣言しましたが、それはおそらく間違っています。

于 2012-08-06T07:04:03.687 に答える
2

ソースを見て、私はそれを次のように変換します:

const
  BioAPI_MAX_STR_LEN = 255;

type
  BioAPI_RETURN = UInt32;

  BioAPI_VERSION_PTR = ^BioAPI_VERSION;
  BioAPI_VERSION = record
    Major: UInt32;
    Minor: UInt32;
  end;

  BioAPI_MALLOC = function(
    Size: UInt32;
    AllocRef: Pointer;
    FileName: PAnsiChar;
    Line: UInt32; 
  ): Pointer stdcall;

  // etc...

  BioAPI_MEMORY_FUNCS_PTR = ^BioAPI_MEMORY_FUNCS;
  BioAPI_MEMORY_FUNCS = record
    Malloc_func: BioAPI_MALLOC;
    Free_func: BioAPI_FREE;
    Realloc_func: BioAPI_REALLOC;
    Calloc_func: BioAPI_CALLOC;
    AllocRef: Pointer;
  end;

  BioAPI_FUNC_NAME_ADDR_PTR = ^BioAPI_FUNC_NAME_ADDR;
  BioAPI_FUNC_NAME_ADDR = record
    Name: array[0..BioAPI_MAX_STR_LEN - 1] of AnsiChar;
    Address: BioAPI_PROC_ADDR;
  end;

  // etc... I'll leave the rest for you. ;-)

function BioAPI_ModuleAttach(
  ModuleGuid: PGUID;
  Version: BioAPI_VERSION_PTR;
  MemoryFuncs: BioAPI_MEMORY_FUNCS_PTR;
  DeviceID,
  Reserved1,
  Reserved2,
  Reserved3: UInt32;
  FunctionTable: BioAPI_FUNC_NAME_ADDR_PTR;
  NumFunctionTable: UInt32;
  Reserved4: Pointer;
  var NewModuleHandle: HMODULE): BioAPI_RETURN; stdcall;  

Win32では、BioAPIは#definedとして定義されている__stdcallため、cdecl間違いなく間違っていることに注意してください。レコードをパックする必要があることを示すものは何もありません。私はそれらを自然な配置のままにしておきます。

于 2012-08-07T23:48:09.593 に答える
1
const
  BioAPI_MAX_STR_LEN = 255;
  BioAPI_OK = 0;
  BioAPI_INVALID_HANDLE = 0;

type
  BioAPI_UUID = packed array[0..15] of Byte; // or TGUID
  BioAPI_UUID_PTR = ^BioAPI_UUID;

  BioAPI_DEVICE_ID = UInt32;

  BioAPI_VERSION = record
        Major: UInt32;
        Minor: UInt32;
  end;
  BioAPI_VERSION_PTR = ^BioAPI_VERSION;

    BioAPI_MALLOC = function(Size: UInt32; Allocref: Pointer): Pointer; cdecl;
  BioAPI_FREE = procedure(Memblock: Pointer; Allocref: Pointer); cdecl;
    BioAPI_REALLOC = function(Memblock: Pointer; Size: UInt32; Allocref: Pointer): Pointer; cdecl;
    BioAPI_CALLOC = function(Num: UInt32; Size: UInt32; Allocref: Pointer): Pointer; cdecl;

  BioAPI_MEMORY_FUNCS = record
        Malloc_func: BioAPI_MALLOC;
    Free_func: BioAPI_FREE;
        Realloc_func: BioAPI_REALLOC;
        Calloc_func: BioAPI_CALLOC;
        AllocRef: Pointer;
  end;
  BioAPI_MEMORY_FUNCS_PTR = ^BioAPI_MEMORY_FUNCS;

  BioAPI_PROC_ADDR = function: UInt32; stdcall;

  BioAPI_FUNC_NAME_ = record
        Name: packed array[0..BioAPI_MAX_STR_LEN-1] of AnsiChar;
        Address: BioAPI_PROC_ADDR;
  end;
  BioAPI_FUNC_NAME_ADDR = array[0..0] of BioAPI_FUNC_NAME_;
  BioAPI_FUNC_NAME_ADDR_PTR = ^BioAPI_FUNC_NAME_ADDR;

  BioAPI_HANDLE = UInt32;
  BioAPI_HANDLE_PTR = ^BioAPI_HANDLE;

function BioAPI_ModuleAttach(
    ModuleGuid: BioAPI_UUID_PTR;
    Version: BioAPI_VERSION_PTR;
    MemoryFuncs: BioAPI_MEMORY_FUNCS_PTR;
    DeviceID: BioAPI_DEVICE_ID;
    Reserved1: UInt32;
    Reserved2: UInt32;
    Reserved3: UInt32;
    FunctionTable: BioAPI_FUNC_NAME_ADDR_PTR;
    NumFunctionTable: UInt32;
    Reserved4: Pointer;
    var NewModuleHandle: BioAPI_HANDLE): UInt32; cdecl; external 'PvFw.dll';

procedure Test;
var
  NewModuleHandle: BioAPI_HANDLE;
begin
  if BioAPI_ModuleAttach(nil, nil, nil, 0, 0, 0, 0, nil, 0, nil, NewModuleHandle) = BioAPI_OK then
  begin
    if NewModuleHandle <> BioAPI_INVALID_HANDLE then
    begin
      // Success
    end;
  end;
end;

cdeclが正しい規約ではない場合は、 stdcallに置き換えてください

于 2012-08-06T11:26:19.583 に答える