我应该在Delphi中使用哪个版本的IMalloc?

4

我正在尝试将 Delphi 5 项目重构为 Delphi XE,为此需要修复名为 BrowseDr 的单元中的一些错误。我遇到的错误是:

[DCC Error] BrowseDr.pas(1033): E2033 Types of actual and formal var parameters
 must be identical

line 1033:   SHGetMalloc(FShellMalloc);

"MyShlObj":

//SHGetMalloc declaration 
function SHGetMalloc(var ppMalloc: IMalloc): HResult; stdcall;

现在,在FShellMalloc的声明中使用的IMalloc来自于OLE2.IMalloc,而在"MyShlObj"中使用的则是ActiveX.IMalloc。

是否可以更改它们中的一个?如果可以,是否推荐这样做?

3个回答

7

OLE2单元是旧版Delphi使用的,现在已被ActiveX单元所取代,因此您必须在新项目中使用ActiveX类型。


好的,谢谢,现在我至少知道在哪里更改了,只需要弄清楚如何更改。 - Roise
1
对于未来的任何人:始终明确指定单元名称前缀(OLE2.x或ActiveX.x),以解决“实际和形式变量参数类型必须相同”的问题。 - Warren P
2
注意:您可以显式限定类型(ActiveX.IMalloc),或确保 ActiveX 单元在 uses 子句中排在首位,但由于后一种解决方案不够稳健,我建议显式限定它。 - Warren P

1

我认为唯一可行的修改是确保FShellMalloc从与MyShlObj使用的相同接口派生。

修改其中一个以使用另一个相同的IMalloc。


是的,那正是我所想的,但我该怎么做呢? - Roise

1

请检查您的使用条款。很多第三方代码使用编译器指令来加载正确的单元。更改编译器版本通常会导致加载错误的文件。

DFS 是一个经典的例子。转到 DFS.INC 并确保定义了适当的 DFS_COMPILER_xxx


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接