看到一个返回程序版本号的函数,如下:
function TForm1.GetBuildInfo: String;
var
    VerInfoSize  : DWORD;
    VerInfo      : Pointer;
    VerValueSize : DWORD;
    VerValue     : PVSFixedFileInfo;
    Dummy        : DWORD;
    V1,V2,V3,V4  : Word;
begin
    VerInfoSize:=GetFileVersionInfoSize(PChar(ParamStr(0)),Dummy);
    if VerInfoSize = 0 then
      begin
          Dummy := GetLastError;
          Result:= '0.0.0.0';
      end;    //if
    GetMem(VerInfo,VerInfoSize);
    GetFileVersionInfo(PChar(ParamStr(0)),0,VerInfoSize,VerInfo);
    VerQueryValue(VerInfo,'\',Pointer(VerValue),VerValueSize);    with VerValue^ do
      begin
          V1:=dwFileVersionMS shr 16;
          V2:=dwFileVersionMs and $FFFF;
          V3:=dwFileVersionLs shr 16;
          V4:=dwFileVersionLs and $FFFF;
      end;    Result:=IntToStr(V1)+'.'
      +IntToStr(V2) + '.'
      +IntToStr(V3) + '.'
      +IntToStr(V4) + '.';
    FreeMem(VerInfo,VerInfoSize);
end;我的问题是:
1.  VerInfoSize:=GetFileVersionInfoSize(PChar(ParamStr(0)),Dummy);这句中GetFileVersionInfoSize的第二个参数应该是一个指针用来接收0值,而此处用的却是一个DWORD,怎么会这样呢?
2.  VerQueryValue的最后一个参数应该是一个Points to a buffer that receives the length,这里用的VerValueSize却是一个DWORD,为什么?
3.  VerValueSize的第三个参数原本不就是一个指针类型吗,为什么此处还要将在用一次类型转换?

解决方案 »

  1.   

    GetFileVersionInfoSize的函數原形是function GetFileVersionInfoSize(   :PAnsiChar ,  : Cardinal ) : DWORD;
    在參數裏面,Cardinal不是指針類型的變量,是一個8位無符號整數
      

  2.   

    可是在win32 sdk的文档里
    确实是这么写的阿
    DWORD GetFileVersionInfoSize(    LPTSTR lptstrFilename, // pointer to filename string
        LPDWORD lpdwHandle  // pointer to variable to receive zero
       );
    怎么到了delphi里,指针就变成dword了?
      

  3.   

    1)delphi的编译器被 DELPHI创始人 改造优化过
    2)因为 DELPHI的指针本来写法就很别扭 没有 C 语言写法强大
      尤其是二级指针
    3)真是由于底层编译 不是 你 说了算 所以你得 听 BORLAND的 要类型强行转换
     如果你能自己写 编译器 你想怎样就怎样 谁也拿你没办法
     !