看到一个返回程序版本号的函数,如下:
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的第三个参数原本不就是一个指针类型吗,为什么此处还要将在用一次类型转换?
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的第三个参数原本不就是一个指针类型吗,为什么此处还要将在用一次类型转换?
在參數裏面,Cardinal不是指針類型的變量,是一個8位無符號整數
确实是这么写的阿
DWORD GetFileVersionInfoSize( LPTSTR lptstrFilename, // pointer to filename string
LPDWORD lpdwHandle // pointer to variable to receive zero
);
怎么到了delphi里,指针就变成dword了?
2)因为 DELPHI的指针本来写法就很别扭 没有 C 语言写法强大
尤其是二级指针
3)真是由于底层编译 不是 你 说了算 所以你得 听 BORLAND的 要类型强行转换
如果你能自己写 编译器 你想怎样就怎样 谁也拿你没办法
!