Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ delphi-调用外部WinAPI函数_C++_Delphi_Winapi_Windows 10 - Fatal编程技术网

C++ delphi-调用外部WinAPI函数

C++ delphi-调用外部WinAPI函数,c++,delphi,winapi,windows-10,C++,Delphi,Winapi,Windows 10,我试图调用函数,但收到错误消息参数不正确。 function IsNativeVhdBoot(var NativeVhdBoot:PBOOL):BOOL; external Kernel32 name 'IsNativeVhdBoot'; function _IsNativeVhdBoot:Boolean; var pB:PBOOL; begin Result := False; if IsNativeVhdBoot(pB) then Result := pB^ els

我试图调用函数,但收到错误消息
参数不正确。

function IsNativeVhdBoot(var NativeVhdBoot:PBOOL):BOOL; external Kernel32 name 'IsNativeVhdBoot';

function _IsNativeVhdBoot:Boolean;
var
  pB:PBOOL;
begin
  Result := False;
  if IsNativeVhdBoot(pB) then
    Result := pB^
  else RaiseLastOSError;
end;
我也试着这样称呼它

function __IsNativeVhdBoot: Boolean;
type
  TIsNativeVhdBoot = function(
    var NativeVhdBoot: pBOOL
  ): BOOL; stdcall;
var
  bNativeVhdBoot: pBOOL;
  NativeVhdBoot : TIsNativeVhdBoot;
begin
  Result := False;
  NativeVhdBoot := GetProcAddress(GetModuleHandle(kernel32), 'IsNativeVhdBoot');
  if (@NativeVhdBoot <> nil) then
  begin
    if not NativeVhdBoot(bNativeVhdBoot) then
      RaiseLastOSError;
    Result := bNativeVhdBoot^;
  end
  else
    RaiseLastOSError;
end;

在您的第一次尝试中,您有一个调用约定不匹配,您链接的文档将其声明为“stdcall”。然而,从对问题和答案的评论来看,这似乎不是您得到“参数不正确”错误的原因。调用似乎在所有情况下都设置了此错误

在这两次尝试中,您的参数都有一个额外的间接级别。文档说明API需要BOOL变量的地址。对参数的解释实际上与文档中的声明不一致,文档中的声明建议使用指向BOOL的指针。然而,“winbase.h”中的实际声明与文档中的声明不同,并且符合以下措辞:

WINBASEAPI
BOOL
WINAPI
IsNativeVhdBoot (
    _Out_ PBOOL NativeVhdBoot
    );
因此,参数是“var BOOL”或“PBOOL”,而不是“var PBOOL”。如果使用“PBOOL”,则必须传递现有BOOL变量的地址,而不是像第一个代码段中那样指向任何地方的指针

在这一点上,我们应该注意到,这实际上并不重要,因为API似乎没有设置“out”参数。这在某种程度上是意料之中的,因为文档很混乱,因为它声明结果将被设置为参数,并将作为函数结果返回。这是不寻常的

注意,根据文档,函数的返回值并不表示函数失败或成功。这本身是不一致的,因为文档还建议调用
GetLastError
,通常只有在函数失败时才会调用
GetLastError
,在调用函数之前,我们无法知道它是否失败。无论如何,这意味着您必须删除在错误返回时引发异常的语句



对于第二个问题,第一个声明静态加载库,第二个代码段动态加载库。有关更多信息,请参阅。如上所述,您还有一个额外的区别,第一个具有寄存器调用约定,但这个区别并不是故意的

该功能的文档似乎有点不对劲。据我所知,至少在Windows10上跟踪到它,该函数返回结果。也就是说,一个错误的结果意味着这不是一个VHD引导,而不是调用失败。@500 InternalServerError:这也是我看到的结果。无论参数是如何传递给函数的,它似乎总是返回false,GetLastError总是说它是一个无效参数,因此似乎输入被忽略,函数实际上返回的是它是否为VHD引导。感谢解释,我已将函数更改为
function IsNativeVhdBoot(var NativeVhdBoot:BOOL):BOOL;stdcall;external kernel32;
lastoError仍然返回
参数不正确。
奇怪的是,文档不清楚何时调用GetLastError,因为错误返回并不意味着函数失败。@Repeat-如果在函数调用之前将最后一个错误设置为0,情况会是这样吗?@setact是的,我在调用它之前尝试将最后一个错误设置为0,但总是返回相同的错误。文档说
BOOL WINAPI IsNativeVhdBoot(\u Out\PBOOL*NativeVhdBoot);
所以它是指向
PBOOL
的指针。我会检查头文件,文档可能是错误的。
WINBASEAPI
BOOL
WINAPI
IsNativeVhdBoot (
    _Out_ PBOOL NativeVhdBoot
    );