问一个简单的问题,快进来接分,急,在线等,有答案马上结!

时间:2021-10-23 19:01:19
我修改了DELPHI目录下的一个\Source\Vcl\OleCtrls.pas 文件,然后我需要重新编译这个OleCtrls.pas 文件,但不懂得如何编译,我试采用了install component的导入新控件方式来编译,但有如下提示:
[Error] dclusr.dpk(36): Package 'vcl' already contains unit 'OleCtrls'

请问,我如何才能成功编译这个文件?

急急急,在线等!!!!

11 个解决方案

#1


修改后,保存就行了,干嘛要再弄个组件安装?

#2


对于使用到该单元的工程,把它添加进工程即可.即使你重新编译了,那只是对于非带包编译的程序当中生效,除非可以把所有使用到该单元的控件包都重新编译.

#3


也许是大家用得少, 在几年之间每当提起这个问题一直有人认为是程序的其它方面有缺陷, 就如同大富翁论坛上的这个帖子一样: http://www.Delphibbs.com/Delphibbs/dispq.asp?lid=347350

而且还有一个专家星人信誓旦旦地给出好几个所谓的解决办法和英文资料, 但是完全无用! 这个人是谁我就不说了. 

但是事实证明并非如此, 而是VCL中对于TOleControl的实现有问题, 也就是说上面那个帖子中最后zhongs的解答才是正确的. 

zhongs建议在TWebBrowser和TOleControl的继承关系中间加入一个修正此问题的中间类...

但是经我观察, 我认为TOleControl存在的缺陷会广泛波及其它既有的和将来可能有的自动化控件, 所以我的建议是对OleCtrls.pas进行如下修改: 

function TOleControl.GetIDispatchProp(Index: Integer): IDispatch;
var
  Temp: TVarData;
begin
  GetProperty(Index, Temp);
  //Result := IDispatch(Temp.VDispatch);
  Pointer(Result) := Temp.VDispatch;
end;

function TOleControl.GetIUnknownProp(Index: Integer): IUnknown;
var
  Temp: TVarData;
begin
  GetProperty(Index, Temp);
  //Result := IUnknown(Temp.VUnknown);
  Pointer(Result) := Temp.VUnknown;
end;

并且要记住重新编译OleCtrls.pas

最后感谢zhongs为我解答这个疑惑

#4


上面这个贴子就是我要问这个问题的原因!,请帮帮忙吧

#5


删除这个单元的.dcu文件,然后在一个项目里应用这个单元,编译该项目,应该没有问题了。
没有修改其属性等公共方法吧?!

#6


把它放到其它项目里编译就会提示找不到那个DCU文件,无法编译啊

#7


把它放到其它项目里编译就会提示找不到那个DCU文件,无法编译啊

#8


引用 5 楼 hulihui 的回复:
删除这个单元的.dcu文件,然后在一个项目里应用这个单元,编译该项目,应该没有问题了。 
没有修改其属性等公共方法吧?!

lib目录下的dcu文件不建议删除.

另外,楼主所说的问题,个人还是不建议用如此方法修改.

原方法会对引用计数进行管理,而修改后的方法,看似把当前出现的问题解决了,但是其它问题可能就会伴随而来.正确的方法是把该释放的接口释放掉.

#9


哪一个是该释放的接口啊?

#10


引用 9 楼 shiandleaf 的回复:
哪一个是该释放的接口啊?

我只是这样子建议,因为没有实际的测试过.所以并不清楚问题可能出在哪里.
但是,如果把TOleControl的代码改掉,那么结果就难以想象了.所有继承于TOleControl或者使用TOleControl相关的东西都会受到影响.

#11


我成功的编译了,那个内存使用确实少了不少哦,也许可能会带来其它的许多问题,但目前还没有发现,暂时用先,谢谢了,结贴了

#1


修改后,保存就行了,干嘛要再弄个组件安装?

#2


对于使用到该单元的工程,把它添加进工程即可.即使你重新编译了,那只是对于非带包编译的程序当中生效,除非可以把所有使用到该单元的控件包都重新编译.

#3


也许是大家用得少, 在几年之间每当提起这个问题一直有人认为是程序的其它方面有缺陷, 就如同大富翁论坛上的这个帖子一样: http://www.Delphibbs.com/Delphibbs/dispq.asp?lid=347350

而且还有一个专家星人信誓旦旦地给出好几个所谓的解决办法和英文资料, 但是完全无用! 这个人是谁我就不说了. 

但是事实证明并非如此, 而是VCL中对于TOleControl的实现有问题, 也就是说上面那个帖子中最后zhongs的解答才是正确的. 

zhongs建议在TWebBrowser和TOleControl的继承关系中间加入一个修正此问题的中间类...

但是经我观察, 我认为TOleControl存在的缺陷会广泛波及其它既有的和将来可能有的自动化控件, 所以我的建议是对OleCtrls.pas进行如下修改: 

function TOleControl.GetIDispatchProp(Index: Integer): IDispatch;
var
  Temp: TVarData;
begin
  GetProperty(Index, Temp);
  //Result := IDispatch(Temp.VDispatch);
  Pointer(Result) := Temp.VDispatch;
end;

function TOleControl.GetIUnknownProp(Index: Integer): IUnknown;
var
  Temp: TVarData;
begin
  GetProperty(Index, Temp);
  //Result := IUnknown(Temp.VUnknown);
  Pointer(Result) := Temp.VUnknown;
end;

并且要记住重新编译OleCtrls.pas

最后感谢zhongs为我解答这个疑惑

#4


上面这个贴子就是我要问这个问题的原因!,请帮帮忙吧

#5


删除这个单元的.dcu文件,然后在一个项目里应用这个单元,编译该项目,应该没有问题了。
没有修改其属性等公共方法吧?!

#6


把它放到其它项目里编译就会提示找不到那个DCU文件,无法编译啊

#7


把它放到其它项目里编译就会提示找不到那个DCU文件,无法编译啊

#8


引用 5 楼 hulihui 的回复:
删除这个单元的.dcu文件,然后在一个项目里应用这个单元,编译该项目,应该没有问题了。 
没有修改其属性等公共方法吧?!

lib目录下的dcu文件不建议删除.

另外,楼主所说的问题,个人还是不建议用如此方法修改.

原方法会对引用计数进行管理,而修改后的方法,看似把当前出现的问题解决了,但是其它问题可能就会伴随而来.正确的方法是把该释放的接口释放掉.

#9


哪一个是该释放的接口啊?

#10


引用 9 楼 shiandleaf 的回复:
哪一个是该释放的接口啊?

我只是这样子建议,因为没有实际的测试过.所以并不清楚问题可能出在哪里.
但是,如果把TOleControl的代码改掉,那么结果就难以想象了.所有继承于TOleControl或者使用TOleControl相关的东西都会受到影响.

#11


我成功的编译了,那个内存使用确实少了不少哦,也许可能会带来其它的许多问题,但目前还没有发现,暂时用先,谢谢了,结贴了