__declspec(dllexport) void __cdecl memcopy(void *pDst, const void *pSrc, unsigned int nSize) { __asm {
mov esi, pSrc
mov edi, pDst
mov ecx, nSize $L1:
movq mm7, [esi]
add esi, 8
movq [edi], mm7
add edi, 8
dec ecx
jne $L1 }; }这是来自CopyBlit8x8.dll的代码
我成功地将此.dll导入到C++控制台应用程序中,并将字符串“Hello World”从char * a复制到char * b。然后回显b成功显示“Hello World”。
然后,由于这是一个通用的内存复制例程,它接受两个指针来执行复制,我在下面这样做了;

这张图片基本上说明了帖子的标题~糟糕的图片格式异常。错误代码: 0x8007000B。
这是一个一般性错误,信息很少,因为它适用于各种场景。但是,我可以放心地假设,它与指针有关。
我想要的是一个快速的内存管理模块来执行通用内存复制,但用于vb.NET镜像。
任何提示,堆栈溢出!
发布于 2016-11-13 18:06:03
当您尝试加载在与应用程序不同的位数下编译的程序集或dll时,将引发。例如,如果您尝试在64位应用程序中加载32位dll (反之亦然)。
确保以与应用程序相同的位数编译dll。如果应用程序编译为AnyCPU,则强制它为x86或x64,或使用每个位编译两个dll,然后导入每个函数(但具有不同的名称),并在检查 后调用正确的函数。
这是AnyCPU解决方案的一个示例:
'32-bit dll
<DllImport("CopyBlit8x8.dll")> _
Public Shared Function memcopy(<insert parameters here>)
End Function
'64-bit dll
<DllImport("CopyBlit8x8_x64.dll")> _
Public Shared Function memcopy64(<insert parameters here>)
End Function
Public Sub DoStuff()
If Environment.Is64BitProcess = True Then
memcopy64(...) 'Call 64-bit dll
Else
memcopy(...) 'Call 32-bit dll
End If
End Sub编辑:
根据Hans Passant的说法,ASM MMX指令不能在x64中使用,所以我上面的解决方案不适合你。但是,我将它留在这里,因为它适用于使用本机C/C++代码编译的DLL。
发布于 2016-11-14 18:09:31
代码:全选
__declspec(dllexport) int __cdecl testApp(long *dst, long *src)
{
__asm {
mov eax, src
mov dst, eax
};
return *dst;
}上面的代码是工作拷贝操作。
代码:全选
Option Explicit On
Imports System.Runtime.InteropServices
Imports System.Text
Imports wow64
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim bm As New Bitmap("1.png")
Dim bm2 As New Bitmap(640, 400)
Dim sb As New StringBuilder
sb.Append("Helo World.")
Dim src() As Byte = ASCIIEncoding.ASCII.GetBytes("Hello")
Dim dst() As Byte = ASCIIEncoding.ASCII.GetBytes("World")
Dim a As IntPtr = Marshal.AllocHGlobal(10)
Dim o As IntPtr = Marshal.AllocHGlobal(10)
Dim i() As Integer = {2, 1}
Marshal.Copy(i, 0, o, 2)
a = (wow64.movq.testApp(a, o))
Button1.Text = ASCIIEncoding.ASCII.GetChars(src)
TextBox1.Text = Marshal.ReadIntPtr(a, 4).ToString
Marshal.FreeHGlobal(a)
'Marshal.FreeHGlobal(o)
End Sub
End Class
Namespace wow64
Public Class movq
<DllImport("D:\CopyBlit8x8.dll", CallingConvention:=CallingConvention.Cdecl)> Public Shared Sub memcopy(ByRef pDsc As StringBuilder, ByRef pSrc As StringBuilder, ByVal nSize As Integer)
End Sub
<DllImport("D:\CopyBlit8x8.dll", CallingConvention:=CallingConvention.Cdecl)> Public Shared Function myPuts(ByRef str As StringBuilder) As Integer
End Function
<DllImport("D:\CopyBlit8x8.dll", CallingConvention:=CallingConvention.Cdecl)> Public Shared Function testApp(ByRef i As Long, ByRef p As Long) As Integer
End Function
End Class
End Namespace此代码是在VB.NET中实现的复制操作。
代码:全选
TextBox1.Text = Marshal.ReadIntPtr(a, 4).ToString这个编组例程使用4^增量来读取数组。
很简单,是吧?
https://stackoverflow.com/questions/40571917
复制相似问题