致[卢培培]:我的程序也是人家给的例子,稍稍该类一下,你试试看: 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
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
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
嵌是能嵌,但在VB的IDE环境中运行没问题,一旦编译就不行了,无论是P代码编译还是本机代码编译都不行。 :(
你的那个编译后也能执行吗?
方便的话也给我一个,多谢!
[email protected]
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
[email protected]
不过这样做也没有什么实际意义。
例子一点都没有参考性。
哈哈,不好意思,碰到祖师了:)
那个例子就是您的!您一定留了几手,怎么样?开讲吧?还是私下传授?
我对汇编就8088那个阶段的水平,请见谅
http://www.21code.com/codebase/?pos=down&id=1901
即:RET 10H 指令解决就可以了。但是我的代码就是不行(不知其数的实验)。
反思:
我的代码里有"INT 21F"中断调用,它是否属于硬件操作(我想应该是)?故Win98视作非法?
如果答案是肯定的话,则此问题可结题了。
;开闭光驱的门:
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
;为消除"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
希望高手继续指点!
而且也不会有问题, 然而很多列程都抱错是大多数都是同一个程序, 有少许bug
因为他最后忘记pop了 而且Gujianda()做资源文件读的方式很好,也绝对可以实现。