BuildCommDCB实际上做了什么?

时间:2015-09-23 05:05:56

标签: c++ c winapi msdn

我刚刚开始做一些Win32编程,我对这个功能感到困惑:

BOOL BuildCommDCB(LPCTSTR szSettings, LPDCB lpDCB);

LPDCB结构的描述指出"它指向DCB结构,其中控制设置信息是 返回&#34 ;.但我的问题是当返回值为BOOL时,DCB结构是如何返回的?

3 个答案:

答案 0 :(得分:3)

LPDCB是您提供(1)的结构的指针BuildCommDCB()将填充该结构 as 返回成功指标。

这与功能没什么不同:

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

,当调用时:

int i1 = -1;
int i2 = setTo13AndReturn42 (&i1);
printf ("%d %d\n", i1, i2);

将输出:

13 42

(1)从Windows的最早天开始,我们不得不忍受奇怪的x86 {tiny, small, medium, large, huge, gargantuan}(或者其他什么实际< / em>调用)内存模型,LP代表长指针。

答案 1 :(得分:3)

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

BOOL BuildCommDCB (LPCTSTR szSettings, LPDCB lpDCB);

有类型和参数:

  • LPCTSTR又称C风格(Type)STRing的长指针。类型实际上是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
} 

参考文献:

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

2 一句警告,BOOL不是bool

3 当然是设备的句柄。

答案 2 :(得分:0)

根据this,第二个参数是_Inout_ LPDCB lpDCB,它是一个指针。这种情况就像指针/引用案例中的任何其他传递一样,其中使用引用

从函数返回信息