我必须与dll进行通信,它是lua,这是我用来按字节写字符串的函数:
writeString = function(pid, process, address, value)
local i = 1
while i <= String.Length(value) do
local byte = string.byte(value, i, i)
DLL.CallFunction("hook.dll", "writeMemByte", pid..','..process..','..address + (i-1)..','..byte, DLL_RETURN_TYPE_INTEGER, DLL_CALL_CDECL)
i = i + 1
end
DLL.CallFunction("hook.dll", "writeMemByte", pid..','..process..','..address + (i-1)..',0', DLL_RETURN_TYPE_INTEGER, DLL_CALL_CDECL)
end
我基本上需要调整它来逐字节写一个双值。 我只是想不出如何制作memory.writeDouble函数。
编辑:这是我的readString函数:
readString = function(pid, process, address)
local i, str = 0, ""
repeat
local curByte = DLL.CallFunction("hook.dll", "readMemByte", pid..','..process..','..(address + i), DLL_RETURN_TYPE_INTEGER, DLL_CALL_CDECL)
if curByte == "" then curByte = 0 end
curByte = tonumber(curByte)
str = str .. string.char(curByte)
i = i + 1
until (curByte == 0)
return str
end,
答案 0 :(得分:0)
Lua有很多可用于此的库。 如果需要生成的字节数组(字符串),string.pack应该这样做;您可以找到Lua for Windows附带的Windows预编译二进制文件。
如果您对使用double与外部代码接口更感兴趣,我建议您使用alien采用不同的方法,这是一个允许您直接调用C函数的外部函数接口库。
如果你能够,我更强烈建议切换到LuaJIT,一个为Lua提供即时编译器,提供C和组装的功能,速度和范围,但是具有舒适性和灵活性LUA。
如果这些解决方案都不可行,我可以提供一些代码来序列化双打(目前无法访问)。
答案 1 :(得分:0)
我的第一个建议是:尝试找到一个接受代表双精度而不是双精度的字符串的函数。实现lua方面会非常容易,因为你已经拥有writeString
- 它可能与此类似:
writeDouble = function(pid, process, address, value)
writeString(pid, process, address, tostring(value))
end
如果您没有该功能,但可以访问dll源,则可以尝试自己添加该功能;它不应该比获取字符串然后在其上调用atof复杂得多。
如果你真的无法修改dll,那么你需要弄清楚lib期望的确切双重格式 - 有很多因素可以改变这种格式。使用的语言和编译器,操作系统和编译器标志,引用一些。
如果dll使用标准格式,例如IEE-754,则格式通常会有来自/两个刻录的文档“翻译”。否则,您可能需要自己开发它们。
问候并祝你好运!