【发布时间】:2015-09-23 05:05:56
【问题描述】:
我刚开始做一些 Win32 编程,我对函数感到困惑:
BOOL BuildCommDCB(LPCTSTR szSettings, LPDCB lpDCB);
LPDCB 结构的描述指出“它指向控制设置信息所在的 DCB 结构
返回”。但我的问题是当返回值为BOOL时,DCB结构如何返回?
【问题讨论】:
我刚开始做一些 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 %d\n", i1, i2);
将输出:
13 42
(1) 从 最早 Windows 的日子开始,我们不得不忍受奇怪的 x86 {tiny, small, medium, large, huge, gargantuan}(或其他任何东西实际上 > 称为)内存模型,LP 代表长指针。
【讨论】:
BOOL GetCommState (HANDLE hCommDev, LPDCB lpDCB); 。 lpCommProb 会被填充吗?与BOOL SetCommState (HANDLE hCommDev, LPDCB lpdcb);等setter函数相比有什么区别?
使用 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当然是设备的句柄。
【讨论】:
按照this,第二个参数是_Inout_ LPDCB lpDCB,是一个指针。这种情况就像任何其他通过指针/引用的情况一样,其中信息使用引用从函数中返回
【讨论】: