我的Dll返回的是String的类型,但是在调用的时候总是报Invalid pointer operation   什么原因?

解决方案 »

  1.   

    还有在调用Dll的时候external和StdCall的功能是什么?总是用,但是不知道为什么要这么用!晕~~~~~~~~~~~~~~~~~
      

  2.   

    external 指示这是一个外部函数
    stdcall 是参数传递顺序的一种用 string 作为参数和返回时,要 uses ShareMem
      

  3.   

    不懂,还是不懂PChar和string有什么区别呀,为什么我以前就可以返回值,而且不会报错,但是同样的代码,只是把函数名称变了,就报错了
      

  4.   

    PChar 以 #0 为结束
    String 用 长度指示
      

  5.   

    Important note about DLL memory management: ShareMem must be the
      first unit in your library's USES clause AND your project's (select
      Project-View Source) USES clause if your DLL exports any procedures or
      functions that pass strings as parameters or function results. This
      applies to all strings passed to and from your DLL--even those that
      are nested in records and classes. ShareMem is the interface unit to
      the BORLNDMM.DLL shared memory manager, which must be deployed along
      with your DLL. To avoid using BORLNDMM.DLL, pass string information
      using PChar or ShortString parameters.   看了这段说明就知道为什么了,这是delphi帮你生成DLL的时候给的一段note
      

  6.   

    我现在想知道为什么还能返回正确的值
    而且我用Try想把错误屏蔽掉,但还是不行
      

  7.   

    string 类型的内存是自动管理的,也就是说你写strTmp := 'aa';的时候,它自动的申请足够放‘aa’的内存。而你写strTmp2 := strTmp;的时候,string 不分配新的内存,只是给strTmp添加一条引用,表示“你现在用的缓冲区别人也在用,你用完了别急着释放”。一直到最后一个使用这片内存的string都不再使用那块缓冲区的时候,这片内存就被释放掉了。好了,说了半天原理该解答问题了^_^当在DLL 中传递string ,并且没有uses ShareMem 的时候,DLL 中使用的string 是可能会有对string 内部缓冲区的引用管理错误的,也就是说:一边认为这些缓冲区已经没有人用了,可以释放了,而另外一边还以为这些缓冲区依旧可以正常使用。这就是报Invalid pointer operation 弹框儿的原因所在了。应该注意的是,内存被释放不表示它们同时被置零了,所以释放后,原来缓冲区里还有那些数据,尽管系统认为这些区域已经无效并且不保证这些区域的安全了。我想这就是还能返回正确值的原因吧。和这个问题类似的还有Delphi 中的动态array。解决这个问题的办法一般有三个:
    1、在两边都uses ShareMem ,注意:ShareMem 必须放在uses 之后第一个。
    2、不在DLL 与EXE 之间传递string,改成传递array[1..BUFF_LEN] of Char,这样虽然比较僵化,却很通用,也可以用来在Delphi 和VC之间传递数据。
    3、用COM 接口
    更多关于delphi 中的字符串问题,可以参考我写的文章《Delphi 中的字符串》,也许会有帮助。http://www.csdn.net/develop/read_article.asp?id=20753