【问题标题】:what does BuildCommDCB actually do?BuildCommDCB 实际上做了什么?
【发布时间】:2015-09-23 05:05:56
【问题描述】:

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

BOOL BuildCommDCB(LPCTSTR szSettings, LPDCB lpDCB);

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

【问题讨论】:

    标签: c++ c winapi msdn


    【解决方案1】:

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

    跟函数没什么区别:

    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}(或其他任何东西实际上 > 称为)内存模型,LP 代表长指针。

    【讨论】:

    • @paxidiablo 谢谢,真的为我解决了问题!只是另一个相关问题:同样的想法是否适用于也返回 Bool 的 Get 函数?例如:BOOL GetCommState (HANDLE hCommDev, LPDCB lpDCB); 。 lpCommProb 会被填充吗?与BOOL SetCommState (HANDLE hCommDev, LPDCB lpdcb);等setter函数相比有什么区别?
    • @Some_Tasty_Donuts,取决于函数本身,您应该检查文档,有太多无法做出全面断言:-) 通常,如果返回,您只能假设结构已被填充值是真的。对于 SetCommState,它使用 LPDCB 来保持一致性,调用时实际上并没有改变数据。
    【解决方案2】:

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

    BOOL BuildCommDCB (LPCTSTR szSettings, LPDCB lpDCB);
    

    有类型和参数:

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

    所以该函数接受一个字符串和一个指向结构的指针(将其视为通过引用传递的一种形式),并返回一个BOOL2 来告诉你它是否是成功的。如果不成功,则说明DCB 中的值尚未设置,您不应使用它们。

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

    例如,如果我告诉您 HMODULE 是模块句柄,您应该知道 HDEVICE3 是什么。

    与往常一样,有关函数的作用以及对它的参数的预期信息的最佳位置是 MSDN。文档说lpDCB 参数是,

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

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

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

    参考资料:


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

    2一句警告,BOOL 不是bool

    3当然是设备的句柄。

    【讨论】:

      【解决方案3】:

      按照this,第二个参数是_Inout_ LPDCB lpDCB,是一个指针。这种情况就像任何其他通过指针/引用的情况一样,其中信息使用引用从函数中返回

      【讨论】:

        猜你喜欢
        • 2013-06-02
        • 2020-11-21
        • 2015-02-26
        • 2017-06-29
        • 2013-06-13
        • 2021-10-25
        • 2011-08-12
        • 2010-11-27
        • 1970-01-01
        相关资源
        最近更新 更多