我想检索msi包的版本信息。
更好的方法是什么?
First:猜测一个足够大的缓冲区,并回忆它不合适的地方(ERROR_MORE_DATA)
1 func调用vs.3 func调用和缓冲区可能比需要的要大。
第二个:调用api函数以获取缓冲区大小,然后收回它以获得具有(完美)匹配缓冲区大小的字符串。
每次调用2个功能,具有完美的缓冲区大小。
它是关于每次(1或3)函数调用和2次函数调用。
对于这个“问题”,有什么最佳做法吗?
我希望得到一个通用的答案(假设调用函数确实是耗时的,并且/或缓冲区大小可能非常不同(10字节到200 10),以便进一步编写代码。:-)
伪码:
第一:
StringBuffer = 10 // (byte) guessing returned string will fit in 10 bytes
result = MsiGetProductInfoW(
product,
INSTALLPROPERTY_VERSIONSTRING,
VersionString,
StringBuffer
); //maybe it fits in 10
if result = ERROR_MORE_DATA then //doesnt fit in 10 so recall to get the correct buffer size
begin
MsiGetProductInfoW(
product,
INSTALLPROPERTY_VERSIONSTRING,
nil,
StringBuffer
);
Inc(StringBuffer); // cause null-terminated string
// recall it with matching
MsiGetProductInfoW(
product,
INSTALLPROPERTY_VERSIONSTRING,
VersionString,
StringBuffer
);
end;第二:
StringBuffer = 0;
// get buffer size
MsiGetProductInfoW(
product,
INSTALLPROPERTY_VERSIONSTRING,
nil,
StringBuffer
);
Inc(StringBuffer); // cause null-terminated string
// use it with the correct buffersize
MsiGetProductInfoW(
product,
INSTALLPROPERTY_VERSIONSTRING,
VersionString,
StringBuffer
);谢谢!
发布于 2010-07-29 19:05:54
在第一个选项中,您可以跳过第二个调用,因为即使在失败的第一个调用中,所需的大小也应该存储在StringBuffer中。
这使得选择(1或2)与(总是2)。这应该足够清楚了。此外,应该不难找到一个合理大小的缓冲区,这将通过90+%的时间。
https://stackoverflow.com/questions/3361066
复制相似问题