【发布时间】:2016-04-02 21:35:06
【问题描述】:
我正在尝试调用 IsNativeVhdBoot 函数,但收到错误消息 The parameter is incorrect.
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;
我的问题是
- 我在调用上述函数时做错了什么。
- 调用
delphi中的extranl WinAPI调用它
function Foo():BOOL; external Kernel32 name 'Foo';和type TFoo = function(): BOOL; stdcall;有什么区别
因为我通常像第一种方法一样进行调用,但是当我收到上述错误消息时,我搜索了如何调用外部函数并找到了另一种方法。
更新
在 C++ 中测试了相同的函数,我得到了同样的错误,我的代码如下
#include "stdafx.h"
#include "Windows.h"
int _tmain(int argc, _TCHAR* argv[])
{
BOOL Result = false;
SetLastError(0);
if (IsNativeVhdBoot(&Result)) {
if (Result) {
printf_s("Running inside VHD\n");
}
else
printf_s("Running inside physical disk drive\n");
}
else
printf("IsNativeVhdBoot failed with error %d.\n", GetLastError());
return 0;
}
【问题讨论】:
-
该函数的文档似乎略有偏差。据我所知,至少在 Windows 10 上跟踪它,该函数返回结果。也就是说,FALSE 结果意味着这不是 VHD 启动,而不是调用失败。
-
@500-InternalServerError: 这也是我看到的结果。无论参数如何传递给函数,它似乎总是返回 false 并且 GetLastError 总是说它是一个无效的参数,所以看起来输入被忽略并且函数实际上返回是否它是 VHD 启动。跨度>
标签: c++ delphi winapi windows-10