PInvoke - 尝试读取或写入受保护的内存。这通常表明其他内存已损坏 [英] PInvoke - Attempted to read or write protected memory. This is often an indication that other memory is corrupt
问题描述
我必须在我的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 ucKeyIndicator;
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 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)]
公共字符串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 andMarshalAs
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++ producesSystem.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屋!