BuildCommDCB实际做什么

what does BuildCommDCB actually do?

本文关键字:什么 BuildCommDCB      更新时间:2023-10-16

我刚刚开始做一些Win32编程,我对函数感到困惑:

BOOL BuildCommDCB(LPCTSTR szSettings, LPDCB lpDCB);

LPDCB结构体的描述指出"它指向控制设置信息所在的DCB结构体。返回"。但我的问题是,当返回值是BOOL时,如何返回DCB结构?

LPDCB是指向您提供的(1)结构的指针,BuildCommDCB()将填充该结构,以及返回一个成功指示符。

这和函数没有区别:

int setTo13AndReturn42 (int *pInt) {
    *pInt = 13;
    return 42;
}

,当使用

调用时
int i1 = -1;
int i2 = setTo13AndReturn42 (&i1);
printf ("%d %dn", i1, i2);

将输出:

13 42

(1)从Windows的最早的日子开始,当我们不得不忍受奇怪的x86 {tiny, small, medium, large, huge, gargantuan}(或者不管它们实际上是 叫什么)内存模型时,LP代表长指针。

使用Windows API,您通常可以通过查看变量名称和类型来判断某事是什么。功能:

BOOL BuildCommDCB (LPCTSTR szSettings, LPDCB lpDCB);

有类型和参数:

  • LPCTSTR又名指向c风格(类型)字符串的长指针。该类型实际上是TCHAR*,如果您有UNICODE定义1最终是wchar_t*类型。变量名为您提供了额外的提示(sz或字符串,以零结尾)。Unicode字符串应该是LPCWSTR
  • LPDCB代表指向DCB的长指针。在定义它的头文件中,该类型被定义为DCB*(变量名再次强调了这一点)

所以这个函数接受一个字符串和一个指向结构体的指针(把它看作是一种引用传递的形式),并返回一个BOOL 2来告诉你它是否成功。如果不成功,则说明DCB中的值没有设置,您不应该使用它们。

这些规则并不总是被遵守,但它们通常足以使您无需太多努力就可以将API类型转换为C类型。

例如,如果我告诉你HMODULE是一个模块句柄,你应该知道HDEVICE 3是什么。

对于函数的功能和参数的期望,MSDN总是最好的信息来源。文档说lpDCB参数是,

指向接收信息的DCB结构的指针。

将这些知识用于示例函数:

DCB dcb;
if (BuildCommDCB(L"Settings", &dcb))
{
    // dcb is valid.
}
else
{
    // dcb is uninitialized garbage
} 

引用:

    <
  • 窗口类型/gh>
  • BuildCommDCB在MSDN

1您确实定义了unicode,对吗?

2一个警告,BOOL不是bool

3当然是设备的句柄

按此,第二个参数是_Inout_ LPDCB lpDCB,它是一个指针。这种情况类似于任何其他通过指针/引用传递的情况,其中使用引用

从函数返回信息。