两段几乎相同的代码,pascal代码运行后成功更改了资源句柄, c++代码却不行,不得其解?

kmfangxun 2006-09-18 11:23:56
//pascal代码,运行后成功更改了资源句柄
function SetResourceHInstance(NewInstance: Longint): LongInt;
var
CurModule: PLibModule;
begin
CurModule := LibModuleList;
Result := 0;
while CurModule <> nil do
begin
if CurModule.Instance = HInstance then
begin
if CurModule.ResInstance <> CurModule.Instance then
FreeLibrary(CurModule.ResInstance);
CurModule.ResInstance := NewInstance;
Result := NewInstance;
Exit;
end;
CurModule := CurModule.Next;
end;
end;


///c++代码,运行后资源句柄没有变化
long int __fastcall SetResourceHInstance(long int NewInstance)
{

long int Result;
TLibModule *CurModule;
CurModule = LibModuleList; //

Result = 0;
while( CurModule != NULL )
{
if (CurModule->instance ==(long) HInstance )
{
if(CurModule->resinstance != CurModule->instance)
FreeLibrary((HINSTANCE)CurModule->resinstance);

CurModule->resinstance = NewInstance;
Result = NewInstance;
break;
}
CurModule = CurModule->next;
}

return Result;

}
//------------------------------------------------------------------------------

两段代码均用Cbuilder6编译。

...全文
258 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
netliuming 2006-09-21
  • 打赏
  • 举报
回复
不明白!!
这个结构不是bcb自身包含的吗?
struct PACKAGE TLibModule
{
TLibModule *next;
long instance;
long codeinstance
long datainstance
long resinstance;
long reserved;
};
extern PACKAGE TLibModule *LibModuleList;
难道是bcb弄错了,能解析一下吗? Delphi转BCB的时候遗漏TLibModule类型.

王集鹄 2006-09-21
  • 打赏
  • 举报
回复
原贴:

将Delphi和BCB声明比较就知道问题了
type
PLibModule = ^TLibModule;
TLibModule = record
Next: PLibModule;
Instance: LongWord;
CodeInstance: LongWord;
DataInstance: LongWord;
ResInstance: LongWord;
Reserved: Integer;
end;


struct PACKAGE TLibModule
{
TLibModule *next;
long instance;
long resinstance;
long reserved;
};

Delphi转BCB的时候遗漏TLibModule类型,汗
kmfangxun 2006-09-21
  • 打赏
  • 举报
回复
呵呵,终于在Delphi区找到答案!


http://community.csdn.net/Expert/topic/5036/5036288.xml?temp=.9968988
王集鹄 2006-09-21
  • 打赏
  • 举报
回复
to netliuming
两边声明不一致

CurModule->resinstance = NewInstance;
实际上是
CurModule->CodeInstance = NewInstance;

难道你的BCB已经打了补丁?这段声明在哪一个文件?
CACACACACA 2006-09-19
  • 打赏
  • 举报
回复
mark
kmfangxun 2006-09-18
  • 打赏
  • 举报
回复
to netliuming

没有效果。


难道Pascal 的Result被赋值后还作了什么吗?
netliuming 2006-09-18
  • 打赏
  • 举报
回复
试试将long改成Cardinal或int不知是否有效?
kmfangxun 2006-09-18
  • 打赏
  • 举报
回复
检查运行后资源句柄是否更改:


//放在c++ return Result
HINSTANCE Hres=(HINSTANCE)FindResourceHInstance((long)HInstance);

if(Hres==(HINSTANCE)Result)
ShowMessage("Changed");
else
ShowMessage("UnChanged");

kmfangxun 2006-09-18
  • 打赏
  • 举报
回复
我是把例子中Reinit.pas改成了C++,其它地方都没有问题,只有列出的代码部分运行后效果不一致。
Y___Y 2006-09-18
  • 打赏
  • 举报
回复
帮顶
i_love_pc 2006-09-18
  • 打赏
  • 举报
回复
学习一下.
kmfangxun 2006-09-18
  • 打赏
  • 举报
回复
楼上看看Cbuilder6的Example\apps\RichEdit就知道了。
我来看看CB 2006-09-18
  • 打赏
  • 举报
回复
看不明白
kmfangxun 2006-09-18
  • 打赏
  • 举报
回复
To: MEFULEU

还是不行。加了 extern PACKAGE int HInstance后;

不得不改为:
if ( CurModule->instance==(long)Sysinit::HInstance )

编译通过,运行后没有需要的效果。
MEFULEU 2006-09-18
  • 打赏
  • 举报
回复
extern PACKAGE int HInstance;


if (int(CurModule->instance) ==HInstance )
make是在1977年在贝尔实验室(Bell Labs)研发的 Unix系统中的一款依赖关系检查工具程序(Utility software)。make的应用非常广泛,它被用来构建 C、C++Pascal  Fortran 等项目,自动化构建生成可执行文件或者库文件。make通过读取Makefile文件以自动化建构软件, 它会根据依赖文件的修改时间进行判断。确定一个target的依赖关系,然后把生成这个target的相关命令传给shell去执行。GNU make 和大多数版本的 make 之间最重要的区别是 GNU make 是自由软件,常和GNU编译系统一起被使用,是大多数GNU Linux安装的一部分。GNU make 在 makefile 中具有许多强大的功能,超出了其他 make 版本的功能,它还可以重新生成、使用、然后删除不需要保存的中间文件。GNU make 还有一些非常方便的简单功能。例如,选项“假装源文件文件没有更改,即使它已更改。当您向头文件添加新宏时,这非常有用。大多数版本的 make 都会假设它们必须重新编译所有使用头文件的源文件,但是如果您知道对头文件的更改不需要重新编译 GNU make 为您提供了一种避免重新编译的方法-o file 。 黄强老师针对零编程基础的同学,精心打磨make核心知识点,帮助你快速掌握Linux编程中的make的构建!适用人群: 零基础、新手、想快速学习Linux下C、C++编程的童鞋!

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧