环境: 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';
×××××××××××××××××××××××××××××××
请教各位,我的问题出在哪儿,该如何解决。
多谢!!!

解决方案 »

  1.   

    你在winapp环境下是否能成功呢。
      

  2.   

    不好意思,我刚回家了,在我家里的电脑安的是vs2005的专业版,在winapp下调试,放到system32下提示无法加载strEx.dll。
    直接引用提示无效的com组件或程序集。难道无法在项目里直接调用他吗?
     另:我在那个web程序里可以调用user32.dll之类的非托管链接库文件的。
      

  3.   

    另:我在那个web程序里可以调用user32.dll之类的非托管链接库文件的可以。
      

  4.   

    sorry
    不知道Knight前辈所说的可以是指什么
    是调用user32.dll呢 还是我的这个个人的dll?因为项目只给了两天时间,明天就要到期了,现在我的用户登录必须通过以前加密过的旧数据进行验证;而以前的项目里的加密算法又是写到了这个strEx.dll文件里的,所以无论如何……
    不说废话了,还是多谢老兄~
      

  5.   

    to 是调用user32.dll呢 还是我的这个个人的dll?如果是标准的dll,一般都可以。除非你的dll有什么特殊的操作。在asp.net中要受到aspnet用户以及安全性的限制。所以你首先最好能在winapp试通这个dll。
      

  6.   

    to:Knight94(愚翁)
    呵呵,我知道,我在“另:我在那个web程序里可以调用user32.dll之类的非托管链接库文件的。”的意思就是我调用系统dll是没问题的。但是这个dll在winapp下也有问题,是不是就不能调用了?
      

  7.   

    to 但是这个dll在winapp下也有问题,是不是就不能调用了?首先你要分清楚dll是否为标准的dll,你在vs环境下用dumpbin输出看看。如果不是的话,不能用dllimport来引入。
      

  8.   

    dumpbin?
    结果如下: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
      

  9.   

    to:kssys() 
    在dephi里面调用时参数如下:
    function Encrypt(const S: string; Key: Word): string;stdcall;
    function Encrypt;external 'StrEx.dll';
    这里用StringBuilder代替string应该没问题,
    而dephi里的word  对应ushort也应该可以吧?
      

  10.   

    估计string的问题,试试如下:
    [DllImport("strEx.dll")]
    public static extern string Encrypt(
    [MarshalAs(UnmanagedType.LPTStr )]string s, ushort i);
      

  11.   

    多谢 Knight94(愚翁):
    但是依然是出这样的错:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
    我现在都不知道该从哪儿下手了
      

  12.   

    试试如下方式:[DllImport("strEx.dll")]
    public static extern IntPtr Encrypt(
    [MarshalAs(UnmanagedType.LPTStr )]string s, ushort i);调用完后获得IntPtr,通过Marshal.PtrToStringAnsi来转换成string。
      

  13.   

    如果如上的方法还不行,修改dll,把返回值用output参数来代替。
      

  14.   

    获得IntPtr后转换也不行
    修改dll? 怎么修改?
      

  15.   

    to 修改dll? 怎么修改?在原函数上增加一个string类型做为输出参数。
      

  16.   

    to Knight94(愚翁) :
    不太明白你的意思啊。首先要说明的是:这个dll我没法编辑。现在的情况是这样;现在这个dll文件是以前他们封装好的。里面封装了现在使用的一个c/s软件登录时的加密解密算法。我现在要在他的基础上开发另外的b/s功能,需要用现有数据库的用户信息进行登录。
    而登录的密码是经过这个dll加密的。
      

  17.   

    一定用他们提供的加密算法吗?是否可以用.net提供的之类来代替呢
      

  18.   

    to 这个dll我没法编辑。如果不能编辑,就比较麻烦了。
    delphi函数进栈和出栈操作不同于一般语言的函数进栈和出栈,因此在用返回值来返回的时候,有时候是有问题的。
      

  19.   

    to Knight94(愚翁) :
    “一定用他们提供的加密算法吗?是否可以用.net提供的之类来代替呢”
    因为c/s的部分还需要继续使用,如果要用.net的加密算法来实现加密的话,我势必要重新建立一套用户数据进行登录管理。“delphi函数进栈和出栈操作不同于一般语言的函数进栈和出栈,因此在用返回值来返回的时候,有时候是有问题的”
    不好意思,我对非托管的链接库文件的调用也仅仅是从昨天晚上才开始研究的 所以并不了解多少。想请问前辈:还有别的方法可行吗?甚谢!!!
      

  20.   

    to 想请问前辈:还有别的方法可行吗?最好是修改dll,用delphi多提供一个接口。
      

  21.   

    to Knight94(愚翁):多谢!
    看来是不行了。
    这个dll文件根本就没有代码,在dephi里也是用的外部调用:
    ××××××××××××××××××××××××××××××
    function Encrypt(const S: string; Key: Word): string;stdcall;
    function Encrypt;external 'StrEx.dll';
    ××××××××××××××××××××××××××××××多谢了 Knight94(愚翁)!
      

  22.   

    如果省事,你用delphi再包一层,重新编一个dll来输出。
      

  23.   

    to Knight94(愚翁) :
    我试试吧  dephi还从来没碰过呢  汗~
      

  24.   

    马上就用dephi太困难了,哪位好心的朋友帮我把这个dll文件打一下包?
      

  25.   

    尝试把DLL参数里面的String类型参数换成PChar试下!
    好像Delphi里面的DLL有String类型在.net里面调用就会出错
    我上次也是这样
    结果把DLL里面的String用PChar代替后问题就没了
      

  26.   

    谢谢fjqiang(五月);今天忙了些乱七八糟,还没来得及试。
    等我找时间测试下。
      

  27.   

    我也遇到了同样的问题。
    "尝试读取或写入受保护的内存。这通常指示其他内存已损坏。"
    请问你后来是如何解决的,谢谢?
    MSN:[email protected]
    Mail:[email protected] 
      

  28.   

    俺的也是 “尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”调用了一个第三方提供的dll文件,用来在内存提取来电显示号码 ,我想应该是内存位置没有找对,所以出现的这个提示
    希望有经验的高手帮忙解决!
      

  29.   

    不好意思 最近一直在忙 那个项目我换了别的方式处理了,fjqiang(五月)的方法我还没测试。
      

  30.   

    to fjqiang(五月);
    “尝试把DLL参数里面的String类型参数换成PChar试下!
    好像Delphi里面的DLL有String类型在.net里面调用就会出错
    我上次也是这样
    结果把DLL里面的String用PChar代替后问题就没了”您所说的把string类型参数换成Pchar?
    是重新编译dll文件吗?我这里没有代码。
    在c#中好像没有Pchar这个类型吧?
      

  31.   

    多谢各位的支持,事情没有解决,主要是不会dephi,没法把这个dll打包。
    算了,劳大家久等了,揭贴了。
      

  32.   

    [DllImport("strEx.dll",CharSet=CharSet.Ansi)]
        public static extern string Encrypt(String s, ushort i);