Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.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
Windows 德尔福_Windows_Delphi_Com_Guid - Fatal编程技术网

Windows 德尔福

Windows 德尔福,windows,delphi,com,guid,Windows,Delphi,Com,Guid,我正在将一个C源代码移植到Delphi中,我的目标是:memcpy(&FFileOperation,&uuuuuuidof(IFileOperation),sizeof(GUID)) 到目前为止,我所拥有的: FFileOperation是一种TGUID类型 CopyMemory(@FFileOperation、@iFileOperation、SizeOf(TGUID)) 但我不知道如何正确使用它。 Delphi中的替代或类似命令是什么?它做什么呢?当需要获取接口的GUID时,您可以使用它。在您

我正在将一个
C
源代码移植到Delphi中,我的目标是:
memcpy(&FFileOperation,&uuuuuuidof(IFileOperation),sizeof(GUID))

到目前为止,我所拥有的:

FFileOperation
是一种
TGUID
类型

CopyMemory(@FFileOperation、@iFileOperation、SizeOf(TGUID))

但我不知道如何正确使用它。
Delphi中的替代或类似命令是什么?它做什么呢?

当需要获取接口的GUID时,您可以使用它。在您的情况下,您正在查找
IFileOperation
的GUID

在Delphi中,编译器为您执行魔术。这里,你需要在C++中使用 代码>,你可以简单地传递接口类型本身,<代码> iIFILATION< /COD>。您可以在任何需要
GUID
的上下文中使用接口类型,只要该接口定义了GUID,编译器将为您完成其余的工作

<>所以,在C++中你可以写:

QueryInterface(__uuidof(IFileOperation), ...)
在Delphi中,您可以编写:

QueryInterface(IFileOperation, ...)
为了向您展示这种魔法的普遍性,我提供了以下有趣的程序:

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  GUID: TGUID;

begin
  GUID := IInterface;
  Writeln(GUIDToString(GUID));
  Readln;
end.
这将产生以下输出:

{00000000-0000-0000-C000-000000000046} 但是,变量的命名很奇怪。名为
FFileOperation
的变量实际上应该这样声明:

FFileOperation := IFileOperation;
FIFileOperationGUID: TGUID;


但我怀疑你是否需要这个变量。看起来它只保存该GUID。该GUID在编译时已知。如果你把它放在任何地方,保持它不变。但是你需要把它放在任何地方吗?当然,您可以删除它并用
IFileOperation

替换所有使用,您可以在需要获取接口GUID时使用它。在您的情况下,您正在查找
IFileOperation
的GUID

在Delphi中,编译器为您执行魔术。这里,你需要在C++中使用 代码>,你可以简单地传递接口类型本身,<代码> iIFILATION< /COD>。您可以在任何需要
GUID
的上下文中使用接口类型,只要该接口定义了GUID,编译器将为您完成其余的工作

<>所以,在C++中你可以写:

QueryInterface(__uuidof(IFileOperation), ...)
在Delphi中,您可以编写:

QueryInterface(IFileOperation, ...)
为了向您展示这种魔法的普遍性,我提供了以下有趣的程序:

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  GUID: TGUID;

begin
  GUID := IInterface;
  Writeln(GUIDToString(GUID));
  Readln;
end.
这将产生以下输出:

{00000000-0000-0000-C000-000000000046} 但是,变量的命名很奇怪。名为
FFileOperation
的变量实际上应该这样声明:

FFileOperation := IFileOperation;
FIFileOperationGUID: TGUID;


但我怀疑你是否需要这个变量。看起来它只保存该GUID。该GUID在编译时已知。如果你把它放在任何地方,保持它不变。但是你需要把它放在任何地方吗?当然,您可以删除它,并用
IFileOperation

替换所有用途。您是否愿意添加
QueryInterface
的位置?我使用的XE4是由
IInterface
定义的三种方法之一,也称为。在任何情况下,无论你在哪里使用它,原则都是一样的。只需删除
\uuidof()
并让Delphi编译器完成其余的工作。对不起,我编辑了我的问题。当我试图复制内存时,它需要一个变量。答案是一样的。如果你需要一个变量,把它放在一个变量里。请看我答案中的程序。就是这样。但在您的情况下,不需要复制
memcpy
。你可以做简单的作业。但请阅读我的最新更新。我强烈怀疑您根本不需要那个变量。我怀疑您正在移植的代码可以在Delphi中大大简化。您是否愿意添加
QueryInterface
的位置?我使用的XE4是由
IInterface
定义的三种方法之一,也称为。在任何情况下,无论你在哪里使用它,原则都是一样的。只需删除
\uuidof()
并让Delphi编译器完成其余的工作。对不起,我编辑了我的问题。当我试图复制内存时,它需要一个变量。答案是一样的。如果你需要一个变量,把它放在一个变量里。请看我答案中的程序。就是这样。但在您的情况下,不需要复制
memcpy
。你可以做简单的作业。但请阅读我的最新更新。我强烈怀疑您根本不需要那个变量。我怀疑您正在移植的代码可以在Delphi中大大简化。