一个WIN98SE下响应ISA卡中断的程序,VC6下没问题,主要程序如下。   
#define ADDRESSPASS  CTL_CODE(FILE_DEVICE_UNKNOWN, 1, METHOD_NEITHER, FILE_ANY_ACCESS)//VXD驱动里也是这么定义的
    
 hDevice = CreateFile("\\\\.\\MY784.VXD", 0,0,0,
                        CREATE_NEW, FILE_FLAG_DELETE_ON_CLOSE, 0);
if (hDevice == INVALID_HANDLE_VALUE) 
{
AfxMessageBox("VxD加载失败",MB_OK);
return 0;
}
if (!DeviceIoControl(hDevice, ADDRESSPASS, CallBackAPC, 0, 0, 0, 0, 0))
{
AfxMessageBox("VxD调用失败",MB_OK);
return 0;
}
while(TRUE) SleepEx(INFINITE , TRUE);
return 0;
DWORD CallBackAPC(PVOID param)
{
li++;
return 0;
}用li来计中断响应的次数。不需要其他数据IO。现在改在VB下,如下,
Private Const ADDRESSPASS = &H220007'在VC中查到ADDRESSPASS的值,不知道对不对。
hFile = CreateFile(fname, GENERIC_WRITE Or GENERIC_READ, _
0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL Or FILE_FLAG_OVERLAPPED, 0)
    If hFile = -1 Then
        MsgBox ("VxD驱动加载失败!")
    End If
    以上没问题。
    deviceio = DeviceIoControl(hFile, ADDRESSPASS, InBuff(0), 0, 0, 0, 0, 0)
    If deviceio = 0 Then
        MsgBox ("VxD调用失败!")
    End Ifdeviceio 这里返回一直是0,参数修改试了很多都不行。我只要求响应中断,计数就可以。多谢指教。GETLASTERORR返回78,两位数好像是78。记得不是很清楚了。主要问题1:deviceiocontrol使用,2:响应中断计数  前边的VC程序在VB中怎么作。答对1个马上50分,2个100。麻烦各位高手现身。

解决方案 »

  1.   

      估计问题出在CallBackAPC 这个参数上
      

  2.   

    deviceio = DeviceIoControl(hFile, ADDRESSPASS, InBuff(0), 0, 0, 0, 0, 0) 你这里传个缓冲区进去干嘛?不是一个回调过程吗?试下这样吧:public function CallBackAPC(byval prarm as long)as long
        '在这里看值
         static tCount as long     tCount=tCount+1
         debug.print tCount     CallBackAPC=0
    end functiondeviceio = DeviceIoControl(hFile, ADDRESSPASS, addressof CallBackAPC, 0, 0, 0, 0, 0)另外,在DeviceIoControl返回后,调用GetLastError,看看到底是什么原因造成的执行失败.
      

  3.   

    昨天去试了,还是不行,提示MsgBox   ( "VxD调用失败! ") 
    GETLASTERROR返回87请大家再帮忙看看
      

  4.   

    87的意思是参数不正确
    你DeviceIoControl的声明怎么写的
      

  5.   

    Private Declare Function DeviceIoControl Lib "kernel32" _
      (ByVal hDevice As Long, _
      ByVal dwIoControlCode As Long, _
       lpInBuffer As Any, _
      ByVal nInBufferSize As Long, _
       lpOutBuffer As Any, _
      ByVal nOutBufferSize As Long, _
       lpBytesReturned As Long, _
       lpOverlapped As Long) As Long
    Public Function CallBackAPC() As Long
        js = js + 1
        jst500.Text33.Text = js
    End FunctionPrivate Const ADDRESSPASS = &H220007
    以上是函数声明和两个相关参数的,请指教,谢谢
      

  6.   

    Private   Const   ADDRESSPASS   =   &H220007 '在VC中查到ADDRESSPASS的值,不知道对不对。
    dim Inbuff(255) as byte
    hFile   =   CreateFile(fname,   GENERIC_WRITE   Or   GENERIC_READ,   _
    0,   0,   OPEN_EXISTING,   FILE_ATTRIBUTE_NORMAL   Or   FILE_FLAG_OVERLAPPED,   0)
            If   hFile   =   -1   Then
                    MsgBox   ( "VxD驱动加载失败! ")
            End   If
            以上没问题。
            deviceio   =   DeviceIoControl(hFile,   ADDRESSPASS,   InBuff(0),   255,   0,   0,   0,   0)
            If   deviceio   =   0   Then
                    MsgBox   ( "VxD调用失败! ")
            End   If
    还有,你哪个ADDRESSPASS的值要准确,在VC中,是用#define   ADDRESSPASS   CTL_CODE(FILE_DEVICE_UNKNOWN,   1,   METHOD_NEITHER,   FILE_ANY_ACCESS)得到的,我不知道 CTL_CODE是什么样的宏命令,所以...
      

  7.   

    晕!deviceio       =       DeviceIoControl(hFile,       ADDRESSPASS,       InBuff(0),       256,       0,       0,       0,       0)
      

  8.   

    10楼提的问题我也有疑问,但是搞不懂。顶楼已经说明了。
    #define   ADDRESSPASS   CTL_CODE(FILE_DEVICE_UNKNOWN,   1,   METHOD_NEITHER,   FILE_ANY_ACCESS)//VXD驱动里也是这么定义的 11楼的用法试了,不行。
      

  9.   

    #define   ADDRESSPASS   CTL_CODE(FILE_DEVICE_UNKNOWN,   1,   METHOD_NEITHER,   FILE_ANY_ACCESS)
    VC,VXD里都是这么用的。
    Private   Const   ADDRESSPASS   =   &H220007  ‘在VC中查到ADDRESSPASS的值,综合其他关于CTL_CODE的帖子来看,这个定义应该是没有错的。DeviceIoControl(hFile,   ADDRESSPASS,   addressof   CallBackAPC,   0,   0,   0,   0,   0) 从参数逐个分析,hFile没问题,ADDRESSPASS应该没问题,无论用addressof CallBackAPC还是 INBUFF(0)都应该是对的,但是就是报错,返回错误87。请高手 出马,感谢!!!
      

  10.   

    这样吧,你跟踪一下看看进行到哪一步时,开始返回87了.然后就再跟踪到那个API,看看它的参数;同时对比一下源代码里所需要的参数,看看是否是那样.调用API的汇编代码应该比较容易看懂,就是PUSH一堆参数后CALL~~祝你好运罗~~~~