如何从 DOSBox 中的汇编程序 运行 将文本插入剪贴板?
How can I insert text in the clipboard from an assembly program running in DOSBox?
我在程序集中有一个包含字符串的 db 变量,如下所示:
STR_VAR db 'test$'
是否可以将此变量复制到剪贴板,以便当用户在另一个程序(例如word)中按Ctrl+V时,它会将文本粘贴到变量中。
编辑:
重要信息:
我正在使用 DOSBox 运行 代码
实际上有一个用于 DOS 的官方 API 用于访问主机的剪贴板,在 Windows 3.x 和 9x 中支持。它在文章 Q67675 中有简要描述,以前在 Microsoft 的知识库中。
这是一个代码示例(NASM 语法):
org 0x100
mov ax, 0x1700 ; IdentifyWinOldApVersion
int 0x2f
cmp ax, 0x1700
jz error
mov ax, 0x1701 ; OpenClipboard
int 0x2f
test ax, ax
jz error
mov ax, 0x1709 ; ClipboardCompact
mov cx, STR_VAR.end - STR_VAR
xor si, si
int 0x2f
cmp dx, si
jb error
ja .fits
cmp cx, ax
jb error
.fits:
mov ax, 0x1703 ; SetClipboardData
mov dx, 7 ; CF_OEMTEXT
mov bx, STR_VAR
; ES and SI:CX already set up
int 0x2f
test ax, ax
jz error
mov ax, 0x1708 ; CloseClipboard
int 0x2f
mov ax, 0x4c00
int 0x21
error:
mov ax, 0x4c01
int 0x21
STR_VAR:
db 'test'
.end:
我非常怀疑香草 DOSBox 是否真的支持这个 API(尽管它显然在 DOSBox-X 中得到支持,一个分支)。
在 TASM 语法中,您需要进行一些添加和更改,以便它适用于最新的 DOSBOX-X。
这是最终的工作版本
IDEAL
MODEL small
STACK 100h
DATASEG
STR_VAR DB 'test',0
CODESEG
start:
mov ax, @data
mov ds, ax
mov ax, 1700h ; IdentifyWinOldApVersion
int 2fh
cmp ax, 1700h
jz error_2
mov ax, 1701h ; OpenClipboard
int 2fh
test ax, ax
jz error_2
mov ax, 1709h ; ClipboardCompact
mov cx, 5 ; STR_VAR.end - STR_VAR
xor si, si
int 2fh
;cmp dx, si
;jb error_2
;ja fits
cmp dx, 0
jne fits
cmp ax, 0
je error_2
jmp fits
cmp cx, ax
jb error_2
fits:
mov ax, 1703h ; SetClipboardData
mov dx, 7 ; CF_OEMTEXT
mov bx, offset STR_VAR
; ES and SI:CX already set up
push ds
pop es
int 2fh
test ax, ax
jz error_2
mov ax, 1708h ; CloseClipboard
int 2fh
mov ax, 4c00h
int 21
error_2:
mov ax, 4c01h
int 21
exit:
mov ax, 4c00h
int 21h
END start
我在程序集中有一个包含字符串的 db 变量,如下所示:
STR_VAR db 'test$'
是否可以将此变量复制到剪贴板,以便当用户在另一个程序(例如word)中按Ctrl+V时,它会将文本粘贴到变量中。
编辑: 重要信息: 我正在使用 DOSBox 运行 代码
实际上有一个用于 DOS 的官方 API 用于访问主机的剪贴板,在 Windows 3.x 和 9x 中支持。它在文章 Q67675 中有简要描述,以前在 Microsoft 的知识库中。
这是一个代码示例(NASM 语法):
org 0x100
mov ax, 0x1700 ; IdentifyWinOldApVersion
int 0x2f
cmp ax, 0x1700
jz error
mov ax, 0x1701 ; OpenClipboard
int 0x2f
test ax, ax
jz error
mov ax, 0x1709 ; ClipboardCompact
mov cx, STR_VAR.end - STR_VAR
xor si, si
int 0x2f
cmp dx, si
jb error
ja .fits
cmp cx, ax
jb error
.fits:
mov ax, 0x1703 ; SetClipboardData
mov dx, 7 ; CF_OEMTEXT
mov bx, STR_VAR
; ES and SI:CX already set up
int 0x2f
test ax, ax
jz error
mov ax, 0x1708 ; CloseClipboard
int 0x2f
mov ax, 0x4c00
int 0x21
error:
mov ax, 0x4c01
int 0x21
STR_VAR:
db 'test'
.end:
我非常怀疑香草 DOSBox 是否真的支持这个 API(尽管它显然在 DOSBox-X 中得到支持,一个分支)。
在 TASM 语法中,您需要进行一些添加和更改,以便它适用于最新的 DOSBOX-X。 这是最终的工作版本
IDEAL
MODEL small
STACK 100h
DATASEG
STR_VAR DB 'test',0
CODESEG
start:
mov ax, @data
mov ds, ax
mov ax, 1700h ; IdentifyWinOldApVersion
int 2fh
cmp ax, 1700h
jz error_2
mov ax, 1701h ; OpenClipboard
int 2fh
test ax, ax
jz error_2
mov ax, 1709h ; ClipboardCompact
mov cx, 5 ; STR_VAR.end - STR_VAR
xor si, si
int 2fh
;cmp dx, si
;jb error_2
;ja fits
cmp dx, 0
jne fits
cmp ax, 0
je error_2
jmp fits
cmp cx, ax
jb error_2
fits:
mov ax, 1703h ; SetClipboardData
mov dx, 7 ; CF_OEMTEXT
mov bx, offset STR_VAR
; ES and SI:CX already set up
push ds
pop es
int 2fh
test ax, ax
jz error_2
mov ax, 1708h ; CloseClipboard
int 2fh
mov ax, 4c00h
int 21
error_2:
mov ax, 4c01h
int 21
exit:
mov ax, 4c00h
int 21h
END start