首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >猜测缓冲区大小并回忆api函数,或者每次调用它两次以获得确切的缓冲区大小。

猜测缓冲区大小并回忆api函数,或者每次调用它两次以获得确切的缓冲区大小。
EN

Stack Overflow用户
提问于 2010-07-29 09:33:30
回答 1查看 173关注 0票数 0

我想检索msi包的版本信息。

更好的方法是什么?

First:猜测一个足够大的缓冲区,并回忆它不合适的地方(ERROR_MORE_DATA)

1 func调用vs.3 func调用和缓冲区可能比需要的要大。

第二个:调用api函数以获取缓冲区大小,然后收回它以获得具有(完美)匹配缓冲区大小的字符串。

每次调用2个功能,具有完美的缓冲区大小。

它是关于每次(1或3)函数调用和2次函数调用。

对于这个“问题”,有什么最佳做法吗?

我希望得到一个通用的答案(假设调用函数确实是耗时的,并且/或缓冲区大小可能非常不同(10字节到200 10),以便进一步编写代码。:-)

伪码:

第一:

代码语言:javascript
复制
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;

第二:

代码语言:javascript
复制
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
);

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-07-29 19:05:54

在第一个选项中,您可以跳过第二个调用,因为即使在失败的第一个调用中,所需的大小也应该存储在StringBuffer中。

这使得选择(1或2)与(总是2)。这应该足够清楚了。此外,应该不难找到一个合理大小的缓冲区,这将通过90+%的时间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3361066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档