MDK/armcc c99编译模式下的inline

先说下c99模式相较于默认的c90模式的优点

  • 变量声明不需要放在函数开头
  • 结构体初始化更方便
  • 增加了inline关键词,用来替代宏定义

那么就来说说inline关键词的使用

使用情况一般分为三种:

  1. 单元外使用
  2. 单元内使用
  3. 单元内外使用

1、单元外使用,需要在(.h)中使用static inline声明并定义:

static inline void func(void){}

2、单元内使用,(.c)中使用static inline申明并定义:

static inline void func(void){}

3、单元内外使用,(.c)使用inline定义,(.h)中声明:

xxx.c

inline void func(void){}

xxx.h

void func(void);

需要注意的是,这种情况下单元内调用是内联的,但是单元外调用则不是。

最后,要使inline生效,需要打开Optimize for time。


WxWidgets编译脚本

@echo off
cd buildmsw
title 编译wxWidgets
echo 开始编译
echo ---------------------------------------------------------------------
echo 编译发行版本
mingw32-make -f makefile.gcc BUILD=release SHARED=1 MONOLITHIC=0 UNICODE=1
echo 编译调试版本
mingw32-make -f makefile.gcc BUILD=debug SHARED=1 MONOLITHIC=0 UNICODE=1
echo ---------------------------------------------------------------------
echo 编译结束
pause


Qt 4.6正式发布!

今天,Qt 4.6和QtCreator 1.3终于正式发布了!大家可以在这里下载。

这次发布的Qt提供了对更多平台的支持,新支持的平台包括Symbian(要求S60 3.1或更高版本),Windows 7,Apple Mac OS 10.6 (Snow Leopard),以及定于明年发布的Maemo 6等。同时,开发社区还提供了对实时系统QNX和VxWorks的支持,而对Maemo 5的支持也在继续开发中(今天也发布了第二个technology preview)。此外,今天还同时发布了用于移动设备的QtMobility项目的technology preview。

Qt 4.6的主要特性 还包括:

Animation Framework - 用以创建具有动画效果的UI,能够充分的和现有的Widget及Graphics View框架结合。

State Machine Framework - 能够方便的构建并执行Harel状态图。

多点触摸 - 通过QTouchEvent和QGestureEvent提供多点触摸和姿态控制。

QtWebkit增强 - 能够方便的访问Web页面中的XML元素,将Web元素嵌入到Graphics View框架中,以及其他新API。

性能优化 - 重写QGraphicsView的渲染算法,新的OpenGL绘图引擎,WebKit性能优化,使用OpenVG支持2G向量图,新的DirectFB支持,等等。

图像特效 - 能够对QGraphicsItem和QWidget添加特效,例如模糊,着色,阴影效果等,也允许自定义特效。

多媒体支持 - 能够处理底层的音频输入输出。

更加完善的XML支持 - 例如能够验证XML Schema等等。


CnWizards 0.9.4.546

0.9.4 较 0.9.3 的更新

+ 增加对 Delphi 2010 的支持。
+ 增加对 Vista/Windows 7 的支持。
+ 行号增加对 BDS 的支持。
+ 为 BDS 窗体设计界面增加工具栏。
* 输入助手增加在特定按键序列后弹出的机制。
* 窗体单元函数列表等搜索时增加对正则表达式的支持。
* 编辑器扩展修正函数头部begin后会自动输入多余end的问题。
* 源码统计修正一处菜单事件错误的问题。
* 代码高亮优化对C/C++文件的支持。
* CnDebugViewer修正一处退出时可能出错的问题。
* 其它的错误修正和改进。

http://www.cnpack.org/showdetail.php?id=662&lang=zh-cn


CnWizards 0.9.3.534

0.9.3 较 0.9.2 的更新

+ 组件选择工具增加按事件过滤的功能。
* 更新日常升级检查模式,帮助中加入隐私保护的说明。
* 代码高亮增加配色方案的导入导出机制。
* 代码高亮优化对回车换行的处理,避免不正确的回车换行引发行绘制偏差。
* 代码高亮修正对当前嵌套子过程判断可能不正确的问题。
* 编辑器标签页修正Delphi 6/C++Builder 6下多行时不能改变高度的问题。
* 修正C++Builder中打开窗体时可能未打开对应Cpp文件的问题。
* MessageBox专家修正一处C++Builder下生成代码可能不正确的问题。
* 修正MSDN专家可能导致IDE关闭时AV的问题。
* 修正前缀专家在D2009下重命名不支持Unicode字符的问题。
* 修正设置Persistent Blocks时助手可能失效的问题。
* 其它的错误修正和改进。

http://www.cnpack.org/showdetail.php?id=654&lang=zh-cn


DllHijacker For Delphi

{*******************************************************}
{                                                       }
{    DllHijacker                                        }
{                                                       }
{    版权所有 (C) 2008 pathletboy                       }
{                                                       }
{*******************************************************}

unit Common;

interface

uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs;

type
   TBuildDprStatus = (SUCCESS, FILE_NOT_FOUND, FILE_READ_ERROR, FILE_NOT_PE,
FILE_NOT_DLL, FILE_NOT_HAVE_EXPORTTABLE, SAVEFILE_ERROR, UNKNOW_ERROR);

function BuildDpr(const FileName: string): TBuildDprStatus;
implementation

function BuildDpr(const FileName: string): TBuildDprStatus;

   function RvaToRaw(const ImageSectionHeader: PImageSectionHeader; Rva:
Cardinal): Cardinal;
   var
Temp: PImageSectionHeader;
   begin
Temp := ImageSectionHeader;
while Temp.VirtualAddress <> 0 do
begin
   if (Rva >= Temp.VirtualAddress) and (Rva < (Temp.VirtualAddress
       + Temp.Misc.VirtualSize)) then
   begin
       Result := Temp.PointerToRawData + Rva - Temp.VirtualAddress;
       Break;
   end;
   inc(Temp);
end;
   end;

var
   TargetFile: TMemoryStream;
   DosHead: TImageDosHeader;
   NtHead: TImageNtHeaders;
   ExportTable: TImageExportDirectory;
   ExportTableAddress: Cardinal;
   //ExportTableSize: Cardinal;
   ExportFunctionNameAddress: Cardinal;
   ArrayFunctionNames: array of string;
   i: Integer;
   OneChar: Char;
   DprFileName: string;
   DprSourceFile: TStringList;
   PSectionHeader: PImageSectionHeader;
begin
   Result := UNKNOW_ERROR;

   if not FileExists(FileName) then
   begin
Result := FILE_NOT_FOUND;
Exit;
   end;

   TargetFile := TMemoryStream.Create;
   try

try
   TargetFile.LoadFromFile(FileName);
   TargetFile.Read(DosHead, SizeOf(DosHead));
   if DosHead.e_magic <> IMAGE_DOS_SIGNATURE then
   begin
       Result := FILE_NOT_PE;
       Exit;
   end;

   TargetFile.Seek(DosHead._lfanew, soFromBeginning);
   TargetFile.Read(NtHead, SizeOf(NtHead));
   if NtHead.Signature <> IMAGE_NT_SIGNATURE then
   begin
       Result := FILE_NOT_PE;
       Exit;
   end;

   if NtHead.FileHeader.Characteristics and IMAGE_FILE_DLL = 0 then
   begin
       Result := FILE_NOT_DLL;
       Exit;
   end;

   if NtHead.OptionalHeader.DataDirectory[0].Size = 0 then //ExportTable
   begin
       Result := FILE_NOT_HAVE_EXPORTTABLE;
       Exit;
   end;
   PSectionHeader := Pointer(DWORD(TargetFile.Memory) + DosHead._lfanew +
       SizeOf(NtHead));

   ExportTableAddress := RvaToRaw(PSectionHeader,
       NtHead.OptionalHeader.DataDirectory[0].VirtualAddress);

   //ExportTableSize := NtHead.OptionalHeader.DataDirectory[0].Size;
   TargetFile.Seek(ExportTableAddress, soFromBeginning);
   TargetFile.Read(ExportTable, SizeOf(ExportTable));
   TargetFile.Seek(RvaToRaw(PSectionHeader,
       DWORD(ExportTable.AddressOfNames)),
       soFromBeginning);
   TargetFile.Read(ExportFunctionNameAddress,
       SizeOf(ExportFunctionNameAddress));
   TargetFile.Seek(RvaToRaw(PSectionHeader, ExportFunctionNameAddress),
       soFromBeginning);
   SetLength(ArrayFunctionNames, ExportTable.NumberOfNames);
   for i := 0 to ExportTable.NumberOfNames - 1 do
   begin
       TargetFile.Read(OneChar, SizeOf(OneChar));
       while OneChar <> #0 do
       begin
      ArrayFunctionNames[i] := ArrayFunctionNames[i] + OneChar;
      TargetFile.Read(OneChar, SizeOf(OneChar));
       end;
       OutputDebugString(PChar(Format('函数名序号:%d 函数名:%s', [i,
      ArrayFunctionNames[i]])));
   end;

   DprFileName := StringReplace(ExtractFileName(FileName),
       ExtractFileExt(FileName), '', [rfReplaceAll]);
   DprSourceFile := TStringList.Create;
   try
       try
      DprSourceFile.Add(Format('library %s;', [DprFileName]));
      DprSourceFile.Add('');
      DprSourceFile.Add('//==============================================================================');
      DprSourceFile.Add('// DllHijacker By pathletboy');
      DprSourceFile.Add('//==============================================================================');
      DprSourceFile.Add('');
      DprSourceFile.Add('uses');
      DprSourceFile.Add(' Windows;');

      DprSourceFile.Add('');
      DprSourceFile.Add('{$R *.res}');
      DprSourceFile.Add('');
      DprSourceFile.Add('var');
      DprSourceFile.Add(' ModHandle: Cardinal;');
      for i := 0 to ExportTable.NumberOfNames - 1 do
      begin
         DprSourceFile.Add(' POld' + ArrayFunctionNames[i] + ': Pointer;');
      end;
      DprSourceFile.Add('');

      for i := 0 to ExportTable.NumberOfNames - 1 do
      begin
         DprSourceFile.Add('procedure ' + ArrayFunctionNames[i] +
             '; asm jmp POld' + ArrayFunctionNames[i] + ' end;');
      end;
      DprSourceFile.Add('');

      DprSourceFile.Add('exports');
      for i := 0 to ExportTable.NumberOfNames - 1 do
      begin
         if i <> ExportTable.NumberOfNames - 1 then
             DprSourceFile.Add(' ' + ArrayFunctionNames[i] + ',')
         else
             DprSourceFile.Add(' ' + ArrayFunctionNames[i] + ';');
      end;
      DprSourceFile.Add('');

      DprSourceFile.Add('begin');
      DprSourceFile.Add(' ModHandle:= LoadLibrary(''' + FileName + ''');');
      DprSourceFile.Add(' if ModHandle > 0 then');
      DprSourceFile.Add(' begin');
      for i := 0 to ExportTable.NumberOfNames - 1 do
      begin
         DprSourceFile.Add(' POld' + ArrayFunctionNames[i] +
             ':= GetProcAddress(ModHandle, ''' + ArrayFunctionNames[i] +
             ''');');
      end;
      DprSourceFile.Add(' end;');
      DprSourceFile.Add('end.');

      DprSourceFile.SaveToFile(ExtractFilePath(Application.ExeName) +
         DprFileName + '.dpr');
      OutputDebugString(PChar(DprFileName + '.dpr Saved!'));
       except
      Result := SAVEFILE_ERROR;
      Exit;
       end;
   finally
       DprSourceFile.Free;
   end;

   OutputDebugString(PChar(DprFileName));
   Result := SUCCESS;
except
   Result := FILE_READ_ERROR;
   Exit;
end;
   finally
TargetFile.Free;
   end;

end;

end.