调用一个设备的操作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);
}
初始化的过程都是好的。但是在读缓存的时候出现如下错误:运行库遇到了错误。此错误的地址为 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);
}
还没有到操作界面就错了
c++ dll 函数声明
*
* 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_ */
[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[]
调用之前要初始化一下
如果用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 的地址不变