当前位置: 首页 > 知识库问答 >
问题:

与具有字符串输出参数的WinAPI函数有多大的一致性?

苏淇
2023-03-14

我最近开始在Windows上用C语言编写程序,并一直在努力小心处理字符串缓冲区的不同方式。例如,GetWindowText()接受最大字符数的int nMaxCount,包括nullGetModuleFileName()获取缓冲区大小的DWORD nSize,单位为TCHARs(我假设这也包括null)。尽管它们的措辞不同,一个使用DWORD,而另一个使用int(为什么类型不同?),行为是一样的,对吗?

两者都返回复制的字符串的长度,不包括null,因此我应该能够重复调用其中一个,将缓冲区大小加倍,直到返回的长度小于传入的缓冲区大小,如下所示:

DWORD buf_size = 1024;
DWORD return_val;
wchar_t *full_path = malloc(buf_size * sizeof(wchar_t));

// double the buffer until it's big enough
while ((return_val = GetModuleFileNameW(NULL, full_path, buf_size)) == buf_size) {
    buf_size *= 2;
    full_path = realloc(full_path, buf_size * sizeof(wchar_t));
}

if (!return_val) {
    fprintf(stderr, "Error in GetModuleFileNameW()\n");
    return NULL;
}

是否所有带有string[out]参数的Windows API函数都以相同的方式工作?是否存在行为不同的单个函数或函数组?(例如,以字节而不是字符为单位的缓冲区大小的函数,或不包含空字符的最大字符串长度的函数,或返回与这两个不同的值的函数)

实际上,我刚刚注意到这两个函数的返回值并不完全一致:GetModuleFileName()在出错时返回0<每当窗口文本有空字符串时,code>GetWindowText()将返回0,我想我在枚举窗口时经常看到空字符串。。。

我想详细了解它的一个原因是,在某些情况下(GetModuleFileName()在WinXP上),代码中的一个off-by-One错误将导致字符串不是以null结尾的。

共有1个答案

上官砚文
2023-03-14

基本上,大多数返回字符串的Win32 API函数都是以一致的方式执行的GetWindowText对于规范的此类函数来说是一个不错的选择。然而,也有例外,我认为从来没有人编制过一份全面的清单。

这里的底线是,每次编写代码调用Win32应用编程接口函数时,您都需要仔细咨询留档。不仅仅是关于字符串输出值的处理,还有所有参数的处理。和所有返回值。和错误处理。整个应用编程接口的风格有所不同,甚至相关函数组也有所不同。

 类似资料:
  • 我整合了Swashbuckle。OData 3.2.0和Swashbuckle。我的WepAPI OData webservice中的Core 5.5.3来生成Swagger documentaion。当我试图访问swaggerendpoint(http://localhost:52460/swagger)时,我得到了下面的异常,这似乎是由一个函数(AppointmentsForUsers)引起的

  • 问题内容: 我进行了很多搜索,但找不到任何东西。.我只是想问一下是否有任何方法可以创建和调用不带参数的过程( Informix )。我知道如何返回一个或多个值(用于过程和函数),但这不是我想要的。如果Informix不允许输出参数,那将真的很奇怪。 提前致谢! 编辑 :是的,我看到了可能,但是我仍然无法执行这样的过程。例如: 我收到的是: 常规mytest无法解决 并且仅在执行具有输出参数的功能时

  • 我有一个未知长度(但不是空)的字符串str和给定的最大长度len,这必须适合。我想做的,就是把绳子剪断。 我知道我可以使用 但这不会派上用场,如果我试图像这样编写堆叠代码 我知道我可以编写自己的函数,但我更喜欢现有的解决方案。Java 中是否存在现有的左()函数?

  • 问题内容: 我可以在下面从C中调用不带参数的Go函数。通过编译并打印 main.go 文件1.c 现在,我想将字符串/字符数组从C传递给GoFunction。 根据cgo文档中的 “对Go的C引用”,这是可能的,因此我向GoFunction添加了一个字符串参数,并将char数组传递给GoFunction: main.go 文件1.c 当我收到此错误: 其他参考:( 信誉不足,无法发布3个链接)根据

  • 可以使用零个或多个参数定义Clojure函数。 传递给函数的值称为arguments ,参数可以是任何类型。 参数的数量是函数的arity。 本章讨论了一些具有不同arities的函数定义。 在以下示例中,函数demo使用每个函数定义的多个参数进行定义。 (defn demo [] (* 2 2)) (defn demo [x] (* 2 x)) (defn demo [x y] (* 2 x y

  • 问题内容: 当我有许多可以引发异常的表达式时,例如: 有没有处理这些表达式通过某种方法 一个 功能 ,将返回一些默认值(或空)如果一个参数是无效的,并抛出一个异常-这可能发生,如果,例如: 这样我就不需要用try-catch块包围每个表达式或检查每个点是否为null。 问题答案: 用途: 这设置为链中是否有任何东西。 如果只想在非空值的情况下设置其值,请删除分配,并将其更改为: