Delphi 不调用初始化部分

Delphi 不调用初始化部分,delphi,linker,initialization,c++builder,virtualtreeview,Delphi,Linker,Initialization,C++builder,Virtualtreeview,我正在为Delphi和C++Builder维护VirtualTreeView组件。使用Delphi一切正常,但是当我使用C++Builder编译包时,Delphi单元中初始化部分的代码没有被调用。在C++ C++ Builder项目中,当Delphi单元的代码< >代码>初始化/代码> />代码>最终完成< /代码>部分时,它通常意味着Delphi单元没有链接到最终的可执行文件,通常是因为C++代码没有直接引用单元中的任何代码,所以它被优化出来。C++Builder在删除未使用的代码方面比Del

我正在为Delphi和C++Builder维护VirtualTreeView组件。使用Delphi一切正常,但是当我使用C++Builder编译包时,Delphi单元中初始化部分的代码没有被调用。在C++ C++ Builder项目中,当Delphi单元的代码< >代码>初始化/代码> />代码>最终完成< /代码>部分时,它通常意味着Delphi单元没有链接到最终的可执行文件,通常是因为C++代码没有直接引用单元中的任何代码,所以它被优化出来。C++Builder在删除未使用的代码方面比Delphi更具攻击性。在Delphi中,只需将一个单元添加到
uses
子句中,就可以强制将该单元链接到。在C++中,情况并非如此。代码>包含Delphi单元<代码> <代码> >。在C++代码中,HP< <代码>文件不足以保证单元链接,如果C++代码不使用任何来自<代码> .HPP文件> < /P> Indy在几个部门遇到了这个问题,最显著的是
IdAllAuthentications
IDAllftplistParser
,以及
IDAllHeaderCodes
。这些单元都只包含初始化/终结代码,没有接口代码,因此它们生成的
.hpp
文件基本上是空的。为了强制链接,我必须将
{$HPPEMIT}
语句添加到
接口
部分,以便在生成的
.hpp
文件中输出
#pragma link
语句。例如:

单元身份验证;
接口
{
请注意,此单元仅用于列出Indy中的所有身份验证。
然后,用户可以将该单元添加到其程序中的uses子句中,并
将所有身份验证链接到他们的程序中。
本单元中绝对不允许使用任何代码。
}
{$I IdCompilerDefines.inc}
//RLEBAU 2/14/09:这迫使C++Builder链接到此单元,以便
//这些装置可以在程序启动时正确注册。。。
{$IFDEF有\u指令\u HPPEMIT\u链接单元}
{$HPPEMIT LINKUNIT}
{$ELSE}
{$HPPEMIT'#pragma链接“IdAllAuthentications”}
{$ENDIF}
实施
//使用在其初始化部分中自注册的单元。。。
结束。
在XE5更新2中引入,以帮助链接使用单元作用域名称的单元:

新:现在可以使用HPPEMITelDelphi编译器指令来链接和生成C++命名空间声明。

{$HPPEMIT LINKUNIT}取代iOS设备目标平台的#pragma链接。 有关详细信息,请参阅HPPEMIT

< >对于C++应用程序,<代码> {$HPPEMIT LIKUng}} /代码>替换了移动平台上的代码> Delphi运行时具有必须链接的单元,以便启用某些功能。在C++中,自动链接是通过以下指令实现的:

{$HPPEMIT'#pragma link'}

现在,您应该使用以下指令:

{$HPPEMIT LINKUNIT}


LINKUNIT
生成一个
#pragma link
语句,该语句使用正确的修饰/命名空间单元名称引用调用单元。

I不能理解这个问题。它缺少细节。你可以展示一些小的RePro代码来演示你的观点吗?你是否期望在C++ Builder下编译Delphi代码?这是两种不同的语言…@Jerry:我不能代表Roman,但我当然希望在C++Builder中使用Delphi代码时能够编译和执行。你认为VCL是什么?这是有点令人不安的,init或Finit代码不从C++ Builder调用。@杰瑞,C++ Builder可以使用Delphi编译的DCU和BPLS。VCL不是用多种语言复制的。@Jerry:“复制”只是Delphi单元的接口部分。它是由Delphi编译器编译成C++头的。我将其添加到ValualTreScR.CPP文件中,下面的行是:“*”链接“虚拟树”和“虚拟树”。我只需将VirtualTree放到一个表单上,就得到了一个AV,因为有些变量没有赋值。@Remy:我们可以在这些单元的方法和构造函数中设置断点,所以我猜该单元是链接进来的。有趣的是,我们不能在VirtualTrees单元的初始化部分的代码中设置断点。所以这在C++ Builder中不被支持,或者单元的初始化部分没有被链接,但是单元的其余部分是。