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中大大简化。