我在较大的应用程序中使用管道时遇到问题,因此我创建了一个最小的测试应用程序来调查问题。
我正在创建一个管道:
Dim sa As SECURITY_ATTRIBUTES
Dim R As Long
sa.nLength = Len(sa)
sa.bInheritHandle = 1
R = CreatePipe(hRead, hWrite, sa, 0) //hRead declared globally
Debug.Print "CreatePipe: " & R
然后我正在读它:
Const BufSize As Long = 1024
Dim Buffer(BufSize) As Byte
Dim lBytesRead As Long
Dim R As Long
R = ReadFile(hRead, Buffer(0), BufSize, lBytesRead, 0)
Debug.Print "ReadFile: " & R
Debug.Print Err.LastDllError
据我所知,ReadFile
调用应该阻止,因为没有人将任何数据写入管道。
问题:如果我把代码放在CreatePipe
代码之后,那只会发生。只要我把它放到一个单独的函数中,它就会失败,最后一个错误是ERROR_INVALID_HANDLE
。 (我确认hRead
的值不会改变)
我完全不知道是什么导致了这种行为。
答案 0 :(得分:1)
我自己找到了解决方案。这是一个相当愚蠢的初学者的错误,但我发现一些用户有同样的问题,并且由于错误症状根本没有指向正确的方向,我会发布我的解决方案。
首先,我做了进一步的重构,使代码更加愚蠢。在使每个变量成为全局变量后,我终于在ReadFile
调用上遇到了“无效的调用约定”错误。
总而言之,对于最后一个参数(ReadFile
参数),OVERLAPPED
的导入声明和实际调用是错误的
这就是我所做的:
Declare Function ReadFile ..., lpOverlapped As Any) As Long
Call ReadFile(..., 0)
正确的是以下任何一个:
Declare Function ReadFile ..., lpOverlapped As Any) As Long
Call ReadFile(..., ByVal 0)
Declare Function ReadFile ..., ByVal lpOverlapped As Long) As Long
Call ReadFile(..., 0)
Declare Function ReadFile ..., lpOverlapped As OVERLAPPED) As Long
Call ReadFile(..., myVariableOfTypeOverlapped)