环境: vs2005
xp sp2, iis5.5?
调用时出错:尝试读取或写入受保护的内存。这通常指示其他内存已损坏
×××××××××××××××××××××××
在web项目中调用一非托管dll;代码如下:
public class strEx
{
[DllImport("strEx.dll",CharSet=CharSet.Auto)]
public static extern string Encrypt(StringBuilder s, ushort i);
}在default页面中:
protected void Page_Load(object sender, EventArgs e)
{
StringBuilder mystrb = new StringBuilder();
Response.Write(strEx.Encrypt(mystrb.Append("aaaaaa"),0));
}
×××××××××××××××××××××××××
结果报错:
“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”
输出信息中有: 在 System.AccessViolationException 中第一次偶然出现的“App_Web_onvcuibc.dll”类型的异常
××××××××××××××××××××××××××××
我怀疑是输入的参数有问题。
在dephi里面调用时参数如下:
function Encrypt(const S: string; Key: Word): string;stdcall;
function Encrypt;external 'StrEx.dll';
×××××××××××××××××××××××××××××××
请教各位,我的问题出在哪儿,该如何解决。
多谢!!!
xp sp2, iis5.5?
调用时出错:尝试读取或写入受保护的内存。这通常指示其他内存已损坏
×××××××××××××××××××××××
在web项目中调用一非托管dll;代码如下:
public class strEx
{
[DllImport("strEx.dll",CharSet=CharSet.Auto)]
public static extern string Encrypt(StringBuilder s, ushort i);
}在default页面中:
protected void Page_Load(object sender, EventArgs e)
{
StringBuilder mystrb = new StringBuilder();
Response.Write(strEx.Encrypt(mystrb.Append("aaaaaa"),0));
}
×××××××××××××××××××××××××
结果报错:
“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”
输出信息中有: 在 System.AccessViolationException 中第一次偶然出现的“App_Web_onvcuibc.dll”类型的异常
××××××××××××××××××××××××××××
我怀疑是输入的参数有问题。
在dephi里面调用时参数如下:
function Encrypt(const S: string; Key: Word): string;stdcall;
function Encrypt;external 'StrEx.dll';
×××××××××××××××××××××××××××××××
请教各位,我的问题出在哪儿,该如何解决。
多谢!!!
解决方案 »
- 请问C#中如何获得字符串的前2二个字符
- ******对接口的一个疑问*********
- 关于hook的问题
- C# .net2005 制作winform时,我想在启动时 检查该应用程序是否已经启动过 ,怎么做呢?
- DataGridView 的问题
- Set oIE=CreateObject("InternetExplorer.Application")在.net中怎么写?
- 非常急,使用OpenNETCF.Net的ConnectToPreferredNetwork方法连接wifi成功,但是一段时间后自动关闭
- 用VS2005可以编辑Win32的exe文件,并可修改其中的控件。在控件上点击鼠标右键,为什么“Add Event Handler”等都是灰色不可选?
- 使用dataset更新行后用commandbuilder不能更新;(附源码和错误信息,请高手帮忙解答!)
- 如何获得发出提交事件的控件?
- C#中怎样连接数据库
- [求助]C#高手请进!!!!!!
直接引用提示无效的com组件或程序集。难道无法在项目里直接调用他吗?
另:我在那个web程序里可以调用user32.dll之类的非托管链接库文件的。
不知道Knight前辈所说的可以是指什么
是调用user32.dll呢 还是我的这个个人的dll?因为项目只给了两天时间,明天就要到期了,现在我的用户登录必须通过以前加密过的旧数据进行验证;而以前的项目里的加密算法又是写到了这个strEx.dll文件里的,所以无论如何……
不说废话了,还是多谢老兄~
呵呵,我知道,我在“另:我在那个web程序里可以调用user32.dll之类的非托管链接库文件的。”的意思就是我调用系统dll是没问题的。但是这个dll在winapp下也有问题,是不是就不能调用了?
结果如下:Dump of file d:\strEx.dllFile Type: DLL Section contains the following exports for StrEX.dll 00000000 characteristics
0 time date stamp Thu Jan 01 08:00:00 1970
0.00 version
1 ordinal base
6 number of functions
6 number of names ordinal hint RVA name 3 0 000123D0 Decrypt
4 1 000122D4 Encrypt
2 2 000124C4 GetPYIndexChar
1 3 000126D4 GetPYofString
5 4 000121F4 HexToStr
6 5 000120F8 StrToHex Summary 1000 .edata
1000 .idata
2000 .reloc
2000 .rsrc
1000 BSS
12000 CODE
1000 DATA
在dephi里面调用时参数如下:
function Encrypt(const S: string; Key: Word): string;stdcall;
function Encrypt;external 'StrEx.dll';
这里用StringBuilder代替string应该没问题,
而dephi里的word 对应ushort也应该可以吧?
[DllImport("strEx.dll")]
public static extern string Encrypt(
[MarshalAs(UnmanagedType.LPTStr )]string s, ushort i);
但是依然是出这样的错:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
我现在都不知道该从哪儿下手了
public static extern IntPtr Encrypt(
[MarshalAs(UnmanagedType.LPTStr )]string s, ushort i);调用完后获得IntPtr,通过Marshal.PtrToStringAnsi来转换成string。
修改dll? 怎么修改?
不太明白你的意思啊。首先要说明的是:这个dll我没法编辑。现在的情况是这样;现在这个dll文件是以前他们封装好的。里面封装了现在使用的一个c/s软件登录时的加密解密算法。我现在要在他的基础上开发另外的b/s功能,需要用现有数据库的用户信息进行登录。
而登录的密码是经过这个dll加密的。
delphi函数进栈和出栈操作不同于一般语言的函数进栈和出栈,因此在用返回值来返回的时候,有时候是有问题的。
“一定用他们提供的加密算法吗?是否可以用.net提供的之类来代替呢”
因为c/s的部分还需要继续使用,如果要用.net的加密算法来实现加密的话,我势必要重新建立一套用户数据进行登录管理。“delphi函数进栈和出栈操作不同于一般语言的函数进栈和出栈,因此在用返回值来返回的时候,有时候是有问题的”
不好意思,我对非托管的链接库文件的调用也仅仅是从昨天晚上才开始研究的 所以并不了解多少。想请问前辈:还有别的方法可行吗?甚谢!!!
看来是不行了。
这个dll文件根本就没有代码,在dephi里也是用的外部调用:
××××××××××××××××××××××××××××××
function Encrypt(const S: string; Key: Word): string;stdcall;
function Encrypt;external 'StrEx.dll';
××××××××××××××××××××××××××××××多谢了 Knight94(愚翁)!
我试试吧 dephi还从来没碰过呢 汗~
好像Delphi里面的DLL有String类型在.net里面调用就会出错
我上次也是这样
结果把DLL里面的String用PChar代替后问题就没了
等我找时间测试下。
"尝试读取或写入受保护的内存。这通常指示其他内存已损坏。"
请问你后来是如何解决的,谢谢?
MSN:[email protected]
Mail:[email protected]
希望有经验的高手帮忙解决!
“尝试把DLL参数里面的String类型参数换成PChar试下!
好像Delphi里面的DLL有String类型在.net里面调用就会出错
我上次也是这样
结果把DLL里面的String用PChar代替后问题就没了”您所说的把string类型参数换成Pchar?
是重新编译dll文件吗?我这里没有代码。
在c#中好像没有Pchar这个类型吧?
算了,劳大家久等了,揭贴了。
public static extern string Encrypt(String s, ushort i);