繁体   English   中英

显式调用WINAPI ReadFile()

[英]Explicitly calling WINAPI ReadFile()

我正在使用Garmin GPS设备,并试图通过USB提取有关纬度,经度等的信息。 我当时在SDK中工作,现在我可以提取此信息,所以现在我正在将该代码滚动到正在使用的系统中。

这段代码被放置在一个类中:CGarminUSBEngine,它继承自CASCIIEngine

我使用代码从设备上提取了此信息

ReadFile (gHandle,
  TheNewBuffer,
  MAX_BUFFER_SIZE,
  &theBytesReturned,
  NULL);

我的问题是CGarminUSBEngine继承的CASCIIEngine具有功能

BOOL ReadFile(void)

当我尝试用5个参数调用ReadFile()从我的USB设备读取时,出现编译器错误,提示“'CASCIIEngine :: Readfile':函数没有5个参数”

我还没有弄清楚如何显式调用此ReadFile()函数的WINAPI版本,或者甚至为什么必须这样做。 在我看来,编译器应该知道ReadFile重载,并且我正在尝试调用WINAPI版本,而不是CASCIIEngine版本。

主要是我想知道如何显式调用WINAPI版本,其次我想确切地知道为什么这样做是必要的。 也许我只是想念它那么简单,真令人沮丧。 我寻求任何帮助。

之所以会出现错误,是因为编译器正在解决对CASCIIEngine::Readfile()的调用,而不是Windows API 提供的全局ReadFile()函数的调用。

显然,参数数量不匹配,因此编译器会抱怨。

要告诉编译器引用全局ReadFile()函数,请使用::范围解析运算符。

   ::ReadFile (gHandle, TheNewBuffer, MAX_BUFFER_SIZE, &theBytesReturned, NULL);
// ^^---- Note `::`

†C ++标准非常详细地列出了确定要解析哪个功能的确切规则。 与您的情况相关的条款如下:

3.4.1不合格的名称查找[basic.lookup.unqual]

1.在3.4.1中列出的所有情况下,都将按照每个相应类别中列出的顺序在范围内搜索声明; 找到名称声明后,名称查找就会结束。 如果找不到声明,则程序格式错误。

...

8.在函数X的成员函数(9.3)的定义中使用的名称,应在该函数的declarator-id之后以下列方式之一声明:

  • 在使用它的块或封闭块(6.3)中使用之前,或
  • X类的成员或X (10.2)的基类的成员,或
  • 如果X是类Y (9.7)的嵌套类,则应是Y的成员,或者应是Y的基类的成员(此查找又适用于Y的封闭类,从最内部的封闭类开始), 要么
  • 如果X是局部类(9.8)或局部类的嵌套类,则在将X类定义包含在X类定义的块中之前,或者
  • 如果X是命名空间的成员N ,或者是一个嵌套类的类是其成员的N ,或者是一个局部的类或局部类的函数是其成员的内嵌套类N ,该构件前函数定义,位于名称空间NN的封闭名称空间之一中。

...

9.3.1非静态成员函数[class.mfct.nonstatic]

2.在非静态成员函数的主体中使用不属于类成员访问语法(5.2.5)且不用于形成指向成员(5.3.1)的指针的id-expression (5.1)时。类X在使用或mem-initializer为类的构造函数X如果名称查找(3.4.1)解决了名字id-expression类的非静态无类型构件X或基类的的X中, id-expression使用(*this) (9.3.2)作为.左侧的后缀表达式,将id-expression转换为类成员访问表达式(5.2.5) . 操作员。 然后,成员名称指代为其调用函数的对象的成员。

按照3.4.1 / 1和3.4.1 / 8,首先在全局命名空间中的ReadFile()之前(最后一个项目符号点)找到CASCIIEngine类中ReadFile()的声明,然后才在CASCIIEngine声明ReadFile() 。解析为成员函数。

这意味着您对类中的ReadFile()调用实际上已被解析为:

(*this).ReadFile(gHandle, TheNewBuffer, MAX_BUFFER_SIZE,
    &theBytesReturned, NULL); // Per 9.3.1/2

因此,甚至不考虑全局函数的重载解析,因为它不是成员函数。

当您按上述方式使用::作用域解析运算符时,它成为引用全局命名空间中名称的合格名称,因此上述规则不适用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM