看到一个返回程序版本号的函数,如下:
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的第三个参数原本不就是一个指针类型吗,为什么此处还要将在用一次类型转换?
解决方案 »
- 就是cxgrid里一列数据,从数字1 .2.3.4.5....100到100吧,能查找出中间丢了哪个数了。
- 如何用二个按钮代替,richedit的滚动条按钮???
- 哪位大哥能让RichEdit不能输入中文?很多大论坛都没能结决!
- 判断某一字符或字符串在一字符串中,用什么函数,返回的为布尔值?
- 请教有关报表打印的问题
- 做二个下拉框将对应dbf的数据按类别分类显示,当第一框中选不同的类别时,
- 采用adoquery1控件动态查询日期字段?
- 200分!!!共享有价值的经验-----有高手乎??Delphi 操作WORD模板中的具体对象!!!
- ODAC 控件的帮助!
- 熟悉Open ToolsAPI的人请进!
- Dlwxn(流云) 朋友还在吗?
- 如何得到一个包含框架的网页里面的所有标签文本?
在參數裏面,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的 要类型强行转换
如果你能自己写 编译器 你想怎样就怎样 谁也拿你没办法
!