PInvoke - 尝试读取或写入受保护的内存。这通常表明其他内存已损坏 [英] PInvoke - Attempted to read or write protected memory. This is often an indication that other memory is corrupt

查看:92
本文介绍了PInvoke - 尝试读取或写入受保护的内存。这通常表明其他内存已损坏的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我必须在我的C#应用​​程序中的DLL函数下面使用PInvoke



无符号字符ucInitDLL(

unsigned char * pszIngeServerName,
unsigned short usPortNumber,

unsigned char * pszIngeServerNameBis,

unsigned short usPortNumberBis,

unsigned short usTimeOutReceptionMS,

unsigned short usTimeOutConnectionSec,

unsigned char * paucMasterKey,

unsigned char * pszShopNumber,

unsigned char * pszCashDeskNumber,
unsigned char * pszCashierNumber)



unsigned char ucGetPinOnline(

unsigned char * pszGenCod,

unsigned char * pszTransacNumber,

xGetPinOut * pxGetPinOut)



typedef struct xGetPinOut

{

unsigned char ucKeyIndi​​cator;

unsigned short usNbAttempt;

unsigned char szRefTrx [10 + 1];

unsigned char szSerialPin [20 +1];

unsigned char szValidityDate [20 + 1];

unsigned char aucRuf [100];

} xGetPinOut;



以下是我的代码



[DllImport(" DLLCLient.dll")]

public static extern void vInitDLL([MarshalAs(UnmanagedType.LPStr)] StringBuilder pszIngeServerName,uint usPortNumber,

[MarshalAs(UnmanagedType.LPStr)] StringBuilder pszIngeServerNameBis,uint usPortNumberBis,

uint usTimeOutReceptionMS,uint usTimeOutConnectionSec,[MarshalAs(UnmanagedType.LPStr)] StringBuilder paucMasterKey,

[MarshalAs(UnmanagedType.LPStr)] StringBuilder pszShopNumber,[MarshalAs(UnmanagedType.LPStr)] StringBuilder pszCashDeskNumber,

[MarshalAs(UnmanagedType.LPStr)] StringBuilder pszCashierNumber);

[DllImport(" DLLCLient.dll")]

public static extern int ucInitDLL([MarshalAs(UnmanagedType.LPStr)] StringBuilder pszIngeServerName,uint usPortNumber,

[MarshalAs(UnmanagedType.LPStr)] StringBuilder pszIngeServerNameBis,uint usPortNumberBis,

uint usTimeOutReceptionMS,uint usTimeOutConnectionSec,[MarshalAs(UnmanagedType.LPStr)] StringBuilder paucMasterKey,

[MarshalAs(UnmanagedType.LPStr)] StringBuilder pszShopNumber,[MarshalAs(UnmanagedType.LPStr)] StringBuilder pszCashDeskNumber,

[MarshalAs(UnmanagedType.LPStr)] StringBuilder pszCashierNumber);

[DllImport(" DLLCLient.dll")]

public static extern char ucGetPinOnline([MarshalAs(UnmanagedType.LPStr)] StringBuilder pszGenCod,

[MarshalAs(UnmanagedType。 LPStr)] StringBuilder pszTransacNumber,out xGetPinOut pxGetPinOut);







[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]

public struct xGetPinOut

{

public string ucKeyIndi​​cator;

public ushort usNbAttempt;

[MarshalAs(UnmanagedType.ByValTStr,SizeConst = 11)]

public string szRefTrx;

[MarshalAs(UnmanagedType.ByValTStr) ,SizeConst = 21)]

public string szSerialPin;

[MarshalAs(UnmanagedType.ByValTStr,SizeConst = 21)]

public string szValidityDate;

[MarshalAs(UnmanagedType.ByValTStr,SizeConst = 100)]

公共字符串aucRuf;

}



但我得到试图读取或写入受保护的内存。这通常表明其他内存已损坏。当我调用该函数时出错。

可能struct导致问题。



请你需要你的帮助解决这个问题。



提前谢谢。

解决方案

我也是懒得查看你的所有代码。很明显,任何微妙的错误都会搞砸(破坏)你的记忆。你只需要彻底检查一切,每个参数和 MarshalAs 参数你也很可能忘记了调用约定这样一个至关重要的事情:

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.callingconvention%28v=vs.90% 29.aspx [ ^ ],

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices .callingconvention%28v = vs.90%29.aspx [ ^ ]。



默认情况下,C ++产生 System.Runtime.InteropServices.CallingConvention.Cdecl



此外,您可以使用PInvoker等实用程序自动化或验证您的工作.NET:

http://www.pinvoker.com [ ^ ]。



-SA

I had to PInvoke below DLL functions in my C# application

Unsigned char ucInitDLL(
unsigned char *pszIngeServerName,
unsigned short usPortNumber,
unsigned char *pszIngeServerNameBis,
unsigned short usPortNumberBis,
unsigned short usTimeOutReceptionMS,
unsigned short usTimeOutConnectionSec,
unsigned char *paucMasterKey,
unsigned char *pszShopNumber,
unsigned char *pszCashDeskNumber,
unsigned char *pszCashierNumber)

unsigned char ucGetPinOnline(
unsigned char *pszGenCod,
unsigned char *pszTransacNumber,
xGetPinOut *pxGetPinOut)

typedef struct xGetPinOut
{
unsigned char ucKeyIndicator;
unsigned short usNbAttempt;
unsigned char szRefTrx[10+1];
unsigned char szSerialPin[20+1];
unsigned char szValidityDate[20+1];
unsigned char aucRuf[100];
}xGetPinOut;

Below is my code

[DllImport("DLLCLient.dll")]
public static extern void vInitDLL([MarshalAs(UnmanagedType.LPStr)] StringBuilder pszIngeServerName, uint usPortNumber,
[MarshalAs(UnmanagedType.LPStr)] StringBuilder pszIngeServerNameBis, uint usPortNumberBis,
uint usTimeOutReceptionMS, uint usTimeOutConnectionSec, [MarshalAs(UnmanagedType.LPStr)] StringBuilder paucMasterKey,
[MarshalAs(UnmanagedType.LPStr)] StringBuilder pszShopNumber, [MarshalAs(UnmanagedType.LPStr)] StringBuilder pszCashDeskNumber,
[MarshalAs(UnmanagedType.LPStr)] StringBuilder pszCashierNumber);
[DllImport("DLLCLient.dll")]
public static extern int ucInitDLL([MarshalAs(UnmanagedType.LPStr)] StringBuilder pszIngeServerName, uint usPortNumber,
[MarshalAs(UnmanagedType.LPStr)] StringBuilder pszIngeServerNameBis, uint usPortNumberBis,
uint usTimeOutReceptionMS, uint usTimeOutConnectionSec, [MarshalAs(UnmanagedType.LPStr)] StringBuilder paucMasterKey,
[MarshalAs(UnmanagedType.LPStr)] StringBuilder pszShopNumber, [MarshalAs(UnmanagedType.LPStr)] StringBuilder pszCashDeskNumber,
[MarshalAs(UnmanagedType.LPStr)] StringBuilder pszCashierNumber);
[DllImport("DLLCLient.dll")]
public static extern char ucGetPinOnline([MarshalAs(UnmanagedType.LPStr)] StringBuilder pszGenCod,
[MarshalAs(UnmanagedType.LPStr)] StringBuilder pszTransacNumber, out xGetPinOut pxGetPinOut);



[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct xGetPinOut
{
public string ucKeyIndicator;
public ushort usNbAttempt;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 11)]
public string szRefTrx;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 21)]
public string szSerialPin;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 21)]
public string szValidityDate;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
public string aucRuf;
}

But I am getting "Attempted to read or write protected memory. This is often an indication that other memory is corrupt." error when I am calling the function.
Probably struct is causing the problem.

Please need your help to solve this.

Thanks in advance.

解决方案

I'm too lazy to check up all your code. It's apparent that any subtle mistake can screw up (corrupt) your memory. You need just to check up everything thoroughly, every parameter and MarshalAs argument. It is also quite likely that you forgot such a critically important thing as calling conventions:
http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.callingconvention%28v=vs.90%29.aspx[^],
http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.callingconvention%28v=vs.90%29.aspx[^].

By default, C++ produces System.Runtime.InteropServices.CallingConvention.Cdecl.

Also, you could automate or validate your work by using such utility as PInvoker.NET:
http://www.pinvoker.com[^].

—SA


这篇关于PInvoke - 尝试读取或写入受保护的内存。这通常表明其他内存已损坏的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆