调用一个设备的操作DLL文件。
初始化的过程都是好的。但是在读缓存的时候出现如下错误:运行库遇到了错误。此错误的地址为 0x79ef067e,在线程 0xe58 上。错误代码为 0xc0000005。此错误可能是 CLR 中的 bug,或者是用户代码的不安全部分或不可验证部分中的 bug。此 bug 的常见来源包括用户对 COM-interop 或 PInvoke 的封送处理错误,这些错误可能会损坏堆栈。        [DllImport("ldv32.dll")]
        private static extern string ldv_get_version();
        [DllImport("ldv32.dll")]
        private static extern short ldv_open(string id,ref short handle);
        [DllImport("ldv32.dll")]
        private static extern short ldv_close(short handle);
        [DllImport("ldv32.dll")]
        private static extern short ldv_read(short handle, ref byte[] data, short len);
        [DllImport("ldv32.dll")]
        private static extern short ldv_read(short handle, byte[] data, short len);//下面是初始化,OK
            ret = ldv_open("LON1", ref handle);
            if (ret == 0)
            {
                Text = Text + "\tOpen device successfully";
                timer1.Enabled = true;
            }//下面是读数据,出现错误
            short ret;
            byte[] data;
            ret = ldv_read(handle, out data, 257); // 错误地点
            if (ret == 0)
            {
                listBox1.Items.Add(DateTime.Now.ToLongTimeString() + data);
            }

解决方案 »

  1.   

    在BCB下面调用该DLL文件则无任何问题。
      

  2.   

    线程中操作界面是否要用到invoke!
      

  3.   

    to Huster2000() 
    还没有到操作界面就错了
      

  4.   

    贴出
    c++ dll 函数声明
      

  5.   

    /*********************************************************************
     *
     * Echelon OpenLDV (TM) API
     *
     * Copyright (c) 1992-2005 Echelon Corporation.  All rights reserved.
     *
     ********************************************************************/#ifndef _LDV32_H_
    #define _LDV32_H_
    #ifndef IN
        #define IN                      /**/
    #endif#ifndef OUT
        #define OUT                     /**/
    #endif#ifndef WM_APP
        #define WM_APP                  0x8000
    #endif
    /*
     * Override the following type definitions
     * if your compiler does not already supply them.
     */#ifndef LDV_TYPES_DEFINED
        typedef          void*          PVOID;
        typedef          short          SHORT;      /*   signed 16-bit */
        typedef          long           LONG;       /*   signed 32-bit */
        typedef unsigned char           BYTE;       /* unsigned  8-bit */
        typedef unsigned short          WORD;       /* unsigned 16-bit */
        typedef unsigned long           DWORD;      /* unsigned 32-bit */
        typedef          char*          LPSTR;
        typedef const    char*          LPCSTR;
        
        typedef          void*          HANDLE;
        /*typedef        void*          HWND;*/    #define VOID     void
        #define LDVAPI   __stdcall
    #endif
    /* OpenLDV structure members are aligned on 32-bit boundaries */
    #pragma pack(push, 4)
        
    typedef SHORT                       LdvHandle;
    /* return codes */
    enum LdvCode {
        LDV_OK                          =  0,
        LDV_NOT_FOUND                   =  1,
        LDV_ALREADY_OPEN                =  2,
        LDV_NOT_OPEN                    =  3,
        LDV_DEVICE_ERR                  =  4,
        LDV_INVALID_DEVICE_ID           =  5,
        LDV_NO_MSG_AVAIL                =  6,
        LDV_NO_BUFF_AVAIL               =  7,
        LDV_NO_RESOURCES                =  8,
        LDV_INVALID_BUF_LEN             =  9,
        LDV_NOT_ENABLED                 = 10,
        
        /* added in OpenLDV 1.0 */
        LDVX_INITIALIZATION_FAILED      = 11,
        LDVX_OPEN_FAILED                = 12,
        LDVX_CLOSE_FAILED               = 13,
        LDVX_READ_FAILED                = 14,
        LDVX_WRITE_FAILED               = 15,
        LDVX_REGISTER_FAILED            = 16,
        LDVX_INVALID_XDRIVER            = 17,
        LDVX_DEBUG_FAILED               = 18,
        LDVX_ACCESS_DENIED              = 19,    /* added in OpenLDV 2.0 */
        LDV_CAPABLE_DEVICE_NOT_FOUND    = 20,
        LDV_NO_MORE_CAPABLE_DEVICES     = 21,
        LDV_CAPABILITY_NOT_SUPPORTED    = 22,
        LDV_INVALID_DRIVER_INFO         = 23,
        LDV_INVALID_DEVICE_INFO         = 24,
        LDV_DEVICE_IN_USE               = 25,
        LDV_NOT_IMPLEMENTED             = 26,
        LDV_INVALID_PARAMETER           = 27,
        LDV_INVALID_DRIVER_ID           = 28,
        LDV_INVALID_DATA_FORMAT         = 29,
        LDV_INTERNAL_ERROR              = 30,
        LDV_EXCEPTION                   = 31,
        LDV_DRIVER_UPDATE_FAILED        = 32,
        LDV_DEVICE_UPDATE_FAILED        = 33,
        LDV_STD_DRIVER_TYPE_READ_ONLY   = 34
    };typedef SHORT                       LDVCode;
    /*
     * Windows Messages for session change notifications
     * (see ldvx_open and/or ldvx_register_window)
     *
     * NOTE: This feature was added in OpenLDV/LNS (V3.20.29).
     */
    #define LDVX_APP                    ((UINT)(WM_APP + 1640))
    #define LDVX_WM_CLOSED              ((UINT)(LDVX_APP + 0))      /* 34408 */
    #define LDVX_WM_CONNECTING          ((UINT)(LDVX_APP + 1))      /* 34409 */
    #define LDVX_WM_ESTABLISHED         ((UINT)(LDVX_APP + 2))      /* 34410 */
    #define LDVX_WM_FAILED              ((UINT)(LDVX_APP + 3))      /* 34411 *//*
     * Windows Messages for LonWorks Interface (e.g. USBLTA)
     * detachment/attachment notifications
     *
     * NOTE: This feature was added in OpenLDV 2.0.
     *
     */
    #define LDVX_WM_DETACHED            ((UINT)(LDVX_APP + 4))      /* 34412 */
    #define LDVX_WM_ATTACHED            ((UINT)(LDVX_APP + 5))      /* 34413 */
    #ifdef __cplusplus
    extern "C"
    {
    #endif  /* __cplusplus */    
    /*
     * Retrieves version number of OpenLDV API.
     *
     *  Release         Version No
     *  --------------------------
     *  OpenLDV 1.0     5.308.09
     *  OpenLDV/LNS     5.320.122
     *  OpenLDV 2.0     5.321.???
     */
    LPCSTR LDVAPI ldv_get_version(VOID);
    /*
     * Opens specified network interface device,
     * returning a handle to be used in subsequent calls.
     */
    LDVCode LDVAPI ldv_open(
        IN  LPCSTR     id,              /* name of network interface device */
        OUT LdvHandle* handle           /* pointer to returned session handle */
    );/*
     * Closes specified open session.
     */
    LDVCode LDVAPI ldv_close(
        IN  LdvHandle handle            /* session handle (from ldv_open) */
    );
    /*
     * Reads a message from specified open session into specified buffer.
     * If no messages are available, returns LDV_NO_MSG_AVAIL.
     * If specified buffer is too small, returns LDV_INVALID_BUF_LEN.
     */
    LDVCode LDVAPI ldv_read(
        IN  LdvHandle handle,           /* session handle (from ldv_open) */
        OUT PVOID     msg_p,            /* pointer to buffer to receive message */
        IN  SHORT     len               /* length  of buffer to receive message */
    );
    /*
     * Writes a message to specified open session from specified buffer.
     */
    LDVCode LDVAPI ldv_write(
        IN LdvHandle handle,            /* session handle (from ldv_open) */
        IN PVOID     msg_p,             /* pointer to buffer containing message */
        IN SHORT     len                /* length  of message to write */
    );
    #ifdef __cplusplus
    }
    #endif  /* __cplusplus */#pragma pack(pop)#endif  /* _LDV32_H_ */
      

  6.   

    try
    [DllImport("ldv32.dll")]
    private static extern short ldv_read(short handle, System.IntPtr data, short len);
    callbyte[] data = new byte[257];
    System.Intptr pdata = Marshal.UnsafeAddrOfPinnedArrayElement( data, 0 );
    ldv_read( handle , pdata , 257 );
    or不要用ref byte[],直接用byte[]
    调用之前要初始化一下
      

  7.   

    lpvoid 是指一个指针,它要求指向一块有效区域,dll 可以修改这块内存区域的内容,
    如果用ref lpvoid ,意思是指传给dll一个指向指针的指针 ,dll 修改这个指向指针的指针的地址,待到回传内容的效果,所以dll 的声明应该是 lpvoid* data 而不是lpvoid 。说得有点绕。
    直接用代码来说吧
    c++
    void test( int* a )
    {
       *a = 10;
    }// 返回时 a指针指向的内容已经变为10;a指针的地址不变
    void test( int** a )
    {
      *a = new int(10);
      
    }// 返回时 a指针指向的地址已改变 a 的地址不变