- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个未管理的 MFC dll 的 C++ .net 包装器。这个包装器由 vb.net dll 使用,调用到我的 c# 代码中。在运行时,包装器有时会抛出 Attempted to read or write protected memory 的异常。
System.AccessViolationException: Attempted to read or write protected memory.
This is often an indication that other memory is corrupt
它似乎是在我的“While”循环中随机出现的。有时它在开头抛出,有时在中间抛出,有时什么都不抛出。
工作原理:我的程序需要一个 MFC dll。我的程序中引用了一个 wrapper.dll(c++) 和一个 myVbDll.dll(vb.net)。我还添加了 MFC dll 作为内容,因为它不是有效的 COM 组件。这就是它的工作原理:
myProgramm.exe->myVbDll.dll->wrapper.dll->myMFC.dll->myMFCfunction
信息:如果我在调用 MyWrappedFunction 之前设置 field = "WHATSOEVER";
,则永远不会抛出错误!!
更新: 多次修改后,问题依旧。我看这个时候把unicode字符串转成Ansi。可能会找到一些东西...因为当您像上面那样在字符串中写入文本时,它可以工作,但是当使用 ToString 函数时,它就不起作用。
有人能说出为什么会这样吗。
我的 C# 程序的一部分(使用 TextFieldParser 从 .csv 文件中读取 5000 行以获取字段):
string[] fields;
string field ;
string temp = "";
TextFieldParser parser = new TextFieldParser(textbox_csv.Text, System.Text.Encoding.UTF8);
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(";");
while (!parser.EndOfData)
{
fields = parser.ReadFields();
field = fields[0];
temp = field.ToUpper();
field = myVbDll.MyWrappedFunction(ref temp, false);
}
VB.net Dll 的一部分,由我的 c# 程序调用:
Public Class myVbDll
Public Declare Auto Function MyWrappedFunction Lib "myWrapper.dll" (ByVal name As String, ByVal opt As Boolean) As String
End Class
MFC 包装器的一部分,由 VB.net Dll 调用(错误肯定不在 MFC dll 中):
typedef void (*MYFUNCTION)(CString&, CString&, BYTE);
MYFUNCTION Myfunction;
LPWSTR _stdcall MyWrappedFunction(LPWSTR ValInput, BYTE opt)
{
HINSTANCE gLibtestDLL=NULL;
CString S_ValInput(ValInput);
CString S_resultat;
gLibtestDLL = AfxLoadLibrary(TEXT(".\\test.dll"));
if(gLibtestDLL == NULL)
{
MessageBox(NULL, TEXT("unable to load test.DLL"), TEXT("Error"),MB_OK | MB_ICONINFORMATION);
return NULL;
}
Myfunction = (MYFUNCTION)GetProcAddress(gLibtestDLL, "Myfunction");
if (Myfunction == NULL)
{
MessageBox(NULL, TEXT("Can't find Myfunction."), TEXT("Error"),MB_OK | MB_ICONINFORMATION);
return NULL;
}
//******************************************************************
S_resultat.LockBuffer();
S_resultat.Format("%64c", ' ');
Myfunction(S_ValInput , S_resultat , opt);
S_resultat.ReleaseBuffer();
S_resultat.LockBuffer();
S_resultat.TrimRight();
S_resultat.ReleaseBuffer();
// CString To UNICODE
USES_CONVERSION;
S_resultat.LockBuffer();
LPWSTR C_tmp= A2OLE(S_resultat.GetBuffer(S_resultat.GetLength()));
S_resultat.ReleaseBuffer();
AfxFreeLibrary(gLibtestDLL);
LPWSTR C_resultat=C_tmp;
//******************************************************************
return C_resultat;
}
最佳答案
LPWSTR C_tmp= A2OLE(S_resultat.GetBuffer(S_resultat.GetLength()));
这是您的 C++ 代码中的一个非常严重的错误。您正在返回局部变量的地址。由 A2OLE() 创建的缓冲区。这会在 C++ 代码中调用未定义的行为。当您从 C++ 代码调用此函数时,这往往会意外起作用,您有可能不会有另一个函数调用覆盖该局部变量曾经所在的堆栈地址。当您 pinvoke 函数时,这些可能性变为零,堆栈地址被 pinvoke marshaller 函数调用删除。如果这本身不会导致崩溃,那么 pinvoke 编码器将确保它在尝试使用 CoTaskMemFree() 释放字符串时崩溃。
您必须先修复您的 C++ 代码。不,只是将指针复制到 C_resultat 中并不能解决问题。
请注意,尝试挽救此功能没有多大意义。它不会做您在 C# 中不能做的任何事情。只需为该“MyFunction”函数编写一个 [DllImport] 属性即可。
关于c# - C++ .NET Wrapper : Attempted to read or write protected memory. 这通常表示其他内存已损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17977263/
这个问题在这里已经有了答案: How to make a property protected AND internal in C#? (8 个答案) 关闭 9 年前。 我需要声明一个既受又 内部保
我有以下代码: class Base{ protected val alpha ="Alpha"; protected def sayHello = "Hello"; } class
我正在尝试运行一个宏来创建一个工作正常的pdf。 Excel 文件获得签名后,Excel 文件将自动受到保护。 问题:我的工作表上有一个按钮,需要按下该按钮才能创建 pdf 文档网。然而,这是无法完成
子类需要能够使用种子随机数生成器。 使用的优点和缺点是什么 public abstract class AbstractClass { protected Random rnd; public
我们有两个类(class)(A 和 B)。 A类只能由继承它的类创建(A类)B 类可以由用户创建。 A 类,版本 1 有一个private 数据成员,并且有方法访问 A 类中的数据。 A 类,版本 2
当父类受到保护时,我对继承类的默认构造函数有疑问,在我看来,子类也会有一个默认构造函数受到保护,但事实并非如此。 除了在子类上强制默认构造函数外,还有其他方法可以强制保护默认构造函数吗? C++11
我有一个抽象类,我想在其 protected 构造函数中初始化一个只读字段。我希望这个只读字段在派生类中可用。 按照我将所有字段设为私有(private)并公开属性的习惯,我实现如下: abstrac
我在运行大数据时遇到错误。错误已由以下示例示例解释 加载数据 mdata <- as.matrix(read.table('https://gubox.box.com/shared/static
我在获取 时遇到问题非法访问错误 对于以下示例: 我在名为 arch 的 gradle 模块中声明了一个基类 abstract class BaseClass { protected abst
我相信通过 实现 JSF 应用程序的安全性+ + & 通过使用 是两种不同的方式!?他们是吗? 我尝试通过上述第一种方法(使用 + + )来实现安全性,但发现使用 protected 和不
有没有办法确定以下的二传手能见度差异: public Prop { get; protected set; } protected Prop { get; set; } 使用反射?还是那些与 C# 反
我读了一本关于 OOP 的书,并且关于“ protected ”访问修饰符的示例对我来说很奇怪。 例子总结 这个例子是为了测试“protected”保留字对变量的影响。 ClassA 有 2 个 pr
内部——在集会上公开,在其他地方私有(private)。 protected - 只有派生类可以访问父类成员。 Protected internal - protected OR internal -
我有一个类代表 Wicket 中带有“返回”、“前进”和“取消”按钮的基本页面。但并非所有页面都有所有按钮,例如。 G。第一页明显没有“返回”。 我的想法是定义一个通用的ActionHandler p
在了解到嵌套类是嵌套类的成员并因此可以完全访问嵌套类的成员这一事实后(至少对于 C++11,请参见 here),我在尝试创建嵌套类模板: #include using namespace std;
我刚刚使用了 Resharper,并一直在尝试将字段转换为属性。我希望这些属性受到保护,但 Resharper 不想给我这个选项。相反,只有一个 protected 内部选项。这让我思考。要么某处有一
这是 question 的扩展一个小时前问过。 当覆盖派生类中的虚方法时,我们不能修改访问修饰符。考虑 System.Web.UI 命名空间中的 Control 类 public class Cont
有人可以解释一下 C# 中 protected 和 protected internal 修饰符之间的区别吗?看起来他们的行为是相同的。 最佳答案 “protected internal”访问修饰符是
我想知道下面两行代码之间是否有区别: protected $var = null; protected $var; 我已经看到两者都被使用了,我想知道这是否只是一个偏好问题,(也就是 $var; 将变
我正在尝试使用mockito为“另存为”操作编写单元测试。该操作的一部分是制作并显示一个文件对话框,用户可以在其中输入要保存的文件。选择文件不是我可以自动化的操作,因此我想模拟 FileDialog
我是一名优秀的程序员,十分优秀!