首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VB.NET错误: 0x8007000B (图像格式错误异常)

VB.NET错误: 0x8007000B (图像格式错误异常)
EN

Stack Overflow用户
提问于 2016-11-13 16:26:51
回答 2查看 533关注 0票数 0
代码语言:javascript
复制
__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镜像。

任何提示,堆栈溢出!

EN

回答 2

Stack Overflow用户

发布于 2016-11-13 18:06:03

当您尝试加载在与应用程序不同的位数下编译的程序集或dll时,将引发。例如,如果您尝试在64位应用程序中加载32位dll (反之亦然)。

确保以与应用程序相同的位数编译dll。如果应用程序编译为AnyCPU,则强制它为x86x64使用每个位编译两个dll,然后导入每个函数(但具有不同的名称),并在检查 后调用正确的函数。

这是AnyCPU解决方案的一个示例:

代码语言:javascript
复制
'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。

票数 1
EN

Stack Overflow用户

发布于 2016-11-14 18:09:31

代码:全选

代码语言:javascript
复制
__declspec(dllexport) int  __cdecl testApp(long *dst, long *src)
{

   __asm {
         mov eax, src
         mov dst, eax
   };

   return *dst;
}

上面的代码是工作拷贝操作。

代码:全选

代码语言:javascript
复制
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中实现的复制操作。

代码:全选

代码语言:javascript
复制
TextBox1.Text = Marshal.ReadIntPtr(a, 4).ToString

这个编组例程使用4^增量来读取数组。

很简单,是吧?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40571917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档