c#调用DELPHI的DLL出现“尝试读取或写入受保护的内存。这通常指示其他内存已损坏 请问在c#中怎么调用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#调用DELPHI的DLL出现“尝试读取或写入受保护的内存。这通常指示其他内存已损坏 请问在c#中怎么调用相关的知识,希望对你有一定的参考价值。
本动态库包括函数Delphi编写1-解密函数
function EB_DecryptFile(const ifn:PChar;const ofn:PChar):Integer;stdcall;external 'EBCryptP.dll';
说明:
ifn:密文文件名,char * 类型,此文件必须存在
ofn:解密后文件名,char * 类型,同名文件会被覆盖
返回结果:Int 型,-1为出错,1为成功。
我已经写出这样的了 [DllImport("EBCryptP.dll", EntryPoint = "EB_EncryptFile", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern int EB_EncryptFile(StringBuilder ifn, StringBuilder ofn);
c = EB_DecryptFile(ifn, ofn);
目前不知道的就是 传入的参数 ifn和ofn是什么类型 如有高手 请出代码 谢谢
可以出代码么 还有 文件路径怎么确定
参考技术B stdcall,你的dll中函数加入了么?PASCL种参数是从左往右的,其他的都是从右往左的。追问
加了
参考技术C 把Dll封装成com,ocx再调用追问dll是delphi写好的 我不知道源码啊
追答再用delphi封装成OCX
追问根本不会delphi。。。。。。
追答找个会delphi的,或都用C#重写DLL吧,我以前也试用调用delphi的dll,没成功,哎。
c# 访问 c++ dll 时尝试读取或写入受保护的内存错误
【中文标题】c# 访问 c++ dll 时尝试读取或写入受保护的内存错误【英文标题】:Attempted to read or write protected memory error while c++ dll is being accessed by c# 【发布时间】:2012-06-04 17:56:43 【问题描述】:下面是c++ dll类
class A
public:
int __thiscall check(char *x,char *y,char *z);
private:
B *temp;
;
class B
friend class A;
Public:
B();
B(string x,string y,string z);
~B();
private:
string x;
string y;
string z;
;
c++ dll方法定义如下
__declspec(dllexport) int __thiscall A::check(char *x,char *y,char *z)
temp=new B(x,y,z); //getting error at this point when i am assigning memory to temp
return 1;
c# dll导入是这样的
[DllImport("MyDll.dll", CallingConvention = CallingConvention.ThisCall, ExactSpelling = true, EntryPoint = "check")]
public static extern int check(IntPtr val,string x,string y,string z);
c++ dll 构建工作正常,但是当 c# 调用 c++ dll 方法时,它看起来也不错,当它进入函数并在方法的第一行中,它尝试为已在 A 类中声明为的临时指针创建内存类 B 的指针,它是私有的。它给出的错误是
Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
【问题讨论】:
您不能 pinvoke C++ 实例方法。 CallingConvention.ThisCall 实际上并没有实现。它崩溃是因为没有创建类对象,隐藏的 this 实例指针是垃圾。您需要使用 C++/CLI 语言编写托管包装器,以便您可以正确使用 new 运算符来创建此类的实例并运行构造函数。和析构函数。 C++/CLI Mixed Mode DLL Creation 的可能重复项 @HansPassant 您的评论不准确。您可以 PInvoke C++ 实例方法。但是,您还需要 PInvoke 构造函数和析构函数才能使其工作。 @HansPassant 另外,这不是您链接到的问题的重复,因为它不是特定于 C++/CLI 的(尽管可能与另一个重复)。 【参考方案1】:__declspec(dllexport)
应该在类上(例如 __declspec(dllexport) MyClass
类),而不是在其成员方法上。
入口点应该是一个错位的 C++ 名称(例如2@MyClass@MyMethod?zii
),而不是“check
”。
您可以使用Depends.exe 查找名称。
【讨论】:
export 在其类上,所以不需要对方法进行导出? 正确,应该只在类上,因为不能直接调用方法——只能通过类(如果是静态的)或实例(如果不是静态的)。 好的,现在该类是一个导出类,并且 check 方法没有任何导出,入口点是我从依赖 walker 获得的“检查”本身。但我仍然遇到同样的错误。 您还必须在 C# 中包装 C++ 类的构造函数和析构函数(以类似的方式)才能使其工作。 @krishna555 将视图更改为 C++ 名称。首先包装(并调用)构造函数。【参考方案2】:我发现了问题,问题在于 C++ 中的检查功能。 temp 应该是这样创建的。
int __thiscall A::check(char *x,char *y,char *z)
A *xyz=new A();
A->temp=new B(x,y,z); // doing this eliminates the issue.
return 1;
感谢所有帮助我的人。
【讨论】:
以上是关于c#调用DELPHI的DLL出现“尝试读取或写入受保护的内存。这通常指示其他内存已损坏 请问在c#中怎么调用的主要内容,如果未能解决你的问题,请参考以下文章
通过 DllImport 在 C# 中调用 C 方法 - 尝试读取或写入受保护的内存