郁闷, 关于BCB的编译器...
新建一工程, 然后代码如下:
//---------------------------------------------------------------------------
#include <vcl.h>
#include <shlobj.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
BOOL IsEnabled()
{
SHELLFLAGSTATE shfs;
SHGetSettings( &shfs, SSF_DESKTOPHTML );
return shfs.fDesktopHTML;
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
BOOL bRet = IsEnabled();
}
//---------------------------------------------------------------------------
大家试一下在Full Debug和Release都编译运行试一下... 可以发现Full Debug下会报AV错, 这个问题把偶搞晕了1个多小时...后来只好动用 OllyDBG看了,结果发现Full Debug和Release情况下IsEnabled()函数的汇编代码:
Release:
PUSH ECX
PUSH 200
LEA EAX,DWORD PTR SS:[ESP+4]
PUSH EAX
CALL <JMP.&SHELL32.SHGetSettings>
MOV AL,BYTE PTR SS:[ESP]
SHL EAX,19
SAR EAX,1F
POP EDX
RETN
Full Debug:
PUSH EBP
MOV EBP,ESP
PUSH ECX
PUSH 200
LEA EAX,DWORD PTR SS:[EBP-2]
PUSH EAX
CALL <JMP.&SHELL32.SHGetSettings>
MOV AL,BYTE PTR SS:[EBP-2]
SHL EAX,19
SAR EAX,1F
POP ECX
POP EBP
RETN
懂汇编的兄弟应该能看出在Full Debug模式下编译出来的汇编代码中EBP在栈中的值被华丽地修改了...
发这个帖子的意思是想提醒大家在工程运行报AV错的时候可以检查一下是不是在Release模式下...
偶是在BCB6 + upd4下测试的, 有条件和兴趣的朋友可以在2006中试一下.