这个让我很困惑。我正在尝试使用ctypes库从Blender中将二进制数据写入Windows剪贴板。它的工作原理!呃......有点儿。出于某种原因,代码以某种方式失败,除非我在某些语句之间散布了一些随机的“打印”语句。打印语句本身不会修改任何代码,它们只是打印出变量的内容或错误代码。注释掉这些行会使程序无效。如果我注释掉#1,我会收到一个错误:“访问冲突写入0x000000000000000000000000”......这绝对不是它应该使用的地址。使用GetLastError()告诉我8,根据这个:http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx说“内存不足”。这绝对不是真的......但我不知道是什么导致它这么想。出于某种原因,拥有上面提到的hexlify函数它神奇地使它工作!至少......那句话。对kernel32或user32的每次调用似乎都需要被print语句分隔出来......或者hexlify ......或者其他什么,我不知道!
无论如何,代码如下,这些神秘的打印语句标有主题标签。请注意,第一个曾经被包围在print语句中,但我发现如果我只是调用函数而不打印它产生的内容它仍然有用。在剩下的4个语句中,我尝试只注释打印行,将上面的赋值保留为“错误” - 停止工作。关于检索变量的东西神奇地修复它......或者可能不是......我对此没有任何线索。我尝试过的一件事,让我更加困惑的是,我尝试从IDLE运行它(之前,它都在Blender中),并且无论打印与否,它都按预期工作。 只有在Blender中,行为才会变得奇怪。我也尝试用“sleep(0.05)”替换打印语句,这没有用。
from ctypes import *
from binascii import *
from struct import *
memcpy = cdll.msvcrt.memcpy
kernel32 = windll.kernel32
user32 = windll.user32
user32.OpenClipboard(None)
user32.EmptyClipboard()
CF_SPARK = user32.RegisterClipboardFormatW("application/spark editor")
GPTR = 0x0040
sampleString = b''
sampleString +=pack('L', 1)
sampleString +=pack('L', 268)
sampleString += b'sheetsmellssheetsmellsbythesheetstore'
#hexlify(sampleString) ########### 1
length = len(sampleString)
memory_handle = kernel32.GlobalAlloc(GPTR,length)
error = kernel32.GetLastError()
print("error= ",error) ########## 2
data_point = kernel32.GlobalLock(memory_handle)
error = kernel32.GetLastError()
print("error= ",error) ########## 3
for i in range(0,length):
value = int.from_bytes((sampleString[i:i+1]), byteorder='little')
memset(data_point+i,value,1)
kernel32.GlobalUnlock(memory_handle)
error = kernel32.GetLastError()
print("error= ",error) ########## 4
user32.SetClipboardData(CF_SPARK,memory_handle)
error = kernel32.GetLastError()
print("error= ",error) ########## 5
user32.CloseClipboard()
顺便说一句,如果有人知道写入剪贴板的方法比使用memset更好,那就太棒了!请注意,我不能使用strcpy或strncpy,因为我正在尝试移动的数据在数据中间有空值...而且使用以null结尾的字符串显然是一件坏事。
编辑:仍然在寻找这个问题的答案。我发现我可以用......替换打印件和hexlify行。
hexlify(b'hello')
......它的效果也一样。再次注意,没有任何转让或声明。声明不应该对程序产生任何影响......但它......不知何故......