有谁熟悉汇编的接口问题?见过利用 CallWindowProc API 函数调用的方法。
但不清楚里边的接口规范,有那位大腕能给讲讲课?(我分不多:)

解决方案 »

  1.   

    VB不能直接内嵌汇编,但也有办法间接嵌汇编。
    嵌是能嵌,但在VB的IDE环境中运行没问题,一旦编译就不行了,无论是P代码编译还是本机代码编译都不行。   :(
      

  2.   

    我这里有个例子,包括一个dll,你要的话留个e-mail
      

  3.   

    先谢谢! email: [email protected]
      

  4.   

    to 一水寒:
    你的那个编译后也能执行吗?
    方便的话也给我一个,多谢!
    [email protected]
      

  5.   

    致[卢培培]:我的程序也是人家给的例子,稍稍该类一下,你试试看:
    Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, Msg As Byte, wParam As Byte, lParam As Byte) As Long
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)Public Function My_GetCpu() As String
      
      Dim MachineCode()         As Byte
      Dim VarAddr               As Long
      Dim FunctAddr             As Long
      Dim h_Wnd                 As Long
      Dim CPUName(1 To 12)      As Byte
      
        h_Wnd = 0
        MachineCode() = LoadResData(101, "CUSTOM")
        VarAddr = VarPtr(MachineCode(0))
        FunctAddr = GetAddress(AddressOf Dummy)
        CopyMemory ByVal FunctAddr, ByVal VarAddr, 35 '35 bytes machine code
        
        On Error Resume Next 'apparently it gets a stack pointer error when in P-Code but i dont know why
          CallWindowProc FunctAddr, h_Wnd, CPUName(1), CPUName(9), CPUName(5)
          'Debug.Print Err; Err.Description
          'MsgBox Err & Err.Description
        On Error GoTo 0
        
        My_GetCpu = StrConv(CPUName(), vbUnicode) 'UnicodeName
        
    End FunctionPrivate Function GetAddress(Address As Long) As Long
        GetAddress = Address
    End FunctionPrivate Sub Dummy()
        x = 0
        x = 1
        x = 2
        x = 3
        x = 4
        x = 5
        x = 6
        x = 7
        x = 8
    End Sub
      

  6.   

    如果ok的话,给我发一份!谢了!
    [email protected]
      

  7.   

    大家找一下,csdn应该有一个帖子里有这样一段程序在vb中使用汇编代码(严格的说应该是机器代码),基本方法就像Gujianda()的那样,用一个字节数组保存机器代码,然后便写一个过程,过程体部分的长度要和字节数组一样,然后通过CopyMemory函数将字节数组的内容拷贝到过程,再通过CallWindowProc调用这个过程。
    不过这样做也没有什么实际意义。
      

  8.   

    致:gcj123,没错,就是这里的。问题是这个例子所用的汇编代码没有代表性!看不明白汇编的接口的规范。您能解释一下吗?比如我有"罗云彬"的CDROM进出盒控制的一段代码,想"嵌入"VB。那个
    例子一点都没有参考性。
      

  9.   

    致:[yunfeng007]
        哈哈,不好意思,碰到祖师了:)
        那个例子就是您的!您一定留了几手,怎么样?开讲吧?还是私下传授?
        我对汇编就8088那个阶段的水平,请见谅
      

  10.   

    vbgood或vb情报局有这方面的例子,不过是用机器码强写的
      

  11.   


    http://www.21code.com/codebase/?pos=down&id=1901
      

  12.   

    看了[chewinggum]介绍的例子,对比原先的代码,觉得其规范也许就是堆栈指针的调整而已。
    即:RET 10H 指令解决就可以了。但是我的代码就是不行(不知其数的实验)。
    反思:
       我的代码里有"INT 21F"中断调用,它是否属于硬件操作(我想应该是)?故Win98视作非法?
    如果答案是肯定的话,则此问题可结题了。
      

  13.   

    win98中可以直接对端口进行操作,但是能不能对中断进行操作我就不知道了,可能要用到vxd吧。如果到了win2000那就更别想了连端口都不让直接访问。如果你要对底层硬件进行操作给我一个mail地址吧,我给你一个对底层端口、内存、中断进行控制的模块,支持2000和98。但是不知道能不能满足你的要求。
      

  14.   

    好的,我把我想嵌入的汇编贴出来:
    ;开闭光驱的门:
    ORG 100H
    START: JMP BEGIN
    CD_DRV DW ?
    COMMAND DB ?
    BUFFER DB 5 DUP(0) ;MAX USED 5 BYTES
    REQ_HEAD DB 1AH ;IOCTL INPUT
    DB 0
    REQ_CMD DB 3 ;(IOCTL OUTPUT: 0CH)
    REQ_ERR DB 09H,0DH,0AH,'USAGE: EJ_CD [/DRIVE:\O|C]',0DH,0AH,24H
    DB 9 DUP(0)
    BUF_OFF DW BUFFER
    BUF_SEG DW ?
    BUF_LEN DW ?
    DB 6 DUP(0)
    ;======================================================
    EJECT_DISK PROC
    MOV BUFFER,0
    MOV BUF_LEN,1
    MOV REQ_CMD,0CH
    MOV AX,1510H
    MOV BUF_SEG,CS
    MOV BX,OFFSET REQ_HEAD
    MOV     CX,CD_DRV
    INT     2FH
    RET
    EJECT_DISK      ENDP
    ;=============================================
    CLOSE_DISK      PROC
    MOV BUFFER,5
    MOV BUF_LEN,1
    MOV REQ_CMD,0CH
    MOV AX,1510H
    MOV BUF_SEG,CS
    MOV BX,OFFSET REQ_HEAD
    MOV     CX,CD_DRV
    INT     2FH
    RET
    CLOSE_DISK      ENDPBEGIN: PUSH CS
    POP ES
    PUSH CS
    POP DS
                      ;......
    JE CLOSE_DOOR
    JMP QUIT

    OPEN_DOOR: CALL    EJECT_DISK ;打开 cd-rom
    JMP QUITCLOSE_DOOR: CALL CLOSE_DISKQUIT: MOV AX,4C00H
    INT     21H
     
      

  15.   

    ;我的做法是:把以下代码用masm5汇编后得到的.com(单独运行能开光驱门)文件作为资源文件读入
    ;为消除"ORG 100H"带来的定位偏移,代码中的符号地址全部改成实际的地址偏移(见注释)
    ;开闭光驱的门:
    ORG 100H
    START: JMP BEGIN
    CD_DRV DW ?
    BUFFER DB 5 DUP(0) ;MAX USED 5 BYTES
    REQ_HEAD DB 1AH ;IOCTL INPUT
    DB 0
    REQ_CMD DB 3 ;(IOCTL OUTPUT: 0CH)
    DB 11 DUP(0)
    BUF_OFF DW BUFFER ;实际置:0003H
    BUF_SEG DW ?
    BUF_LEN DW ?
    DB 6 DUP(0)
    ;======================================================
    BEGIN: MOV BUFFER,0 ;实际这条指令没加
    MOV BUF_LEN,1 ;实际在定义是就置:0001H
    MOV REQ_CMD,0CH ;实际在定义是就置:000CH
    MOV AX,1510H ;
    MOV BUF_SEG,CS ;
    MOV BX,OFFSET REQ_HEAD ;实际偏移:000AH
    MOV CX,CD_DRV ;实际直接赋:5(我的光驱为F:)
    INT 2FH
    RET      10H
    希望高手继续指点!
      

  16.   

    其实通常意义上的嵌入汇编代码在vb中是不可能实现;楼主给出的开闭光驱的汇编代码应该是16位下的DOS环境下的代码。
      

  17.   

    可以肯定vb 是可以通过 callwindowproc 调用汇编的
    而且也不会有问题, 然而很多列程都抱错是大多数都是同一个程序, 有少许bug
    因为他最后忘记pop了 而且Gujianda()做资源文件读的方式很好,也绝对可以实现。