问题描述
我在程序集中有一个包含字符串的 db 变量,如下所示:
STR_VAR db 'test$'
是否可以将此变量复制到剪贴板,以便当用户在另一个程序(例如 word)中按 Ctrl+V 时,它会将文本粘贴到变量中。
解决方法
实际上有一个用于访问主机剪贴板的 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,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