情况描述:
    一个用VC写的程序,调用了一个DLL文件EssApin.dll,编译成A.exe,可以成功执行。
    将这个A.exe改写编译为B.dll,用另一个VC写的程序C.exe调用B.dll,也可以成功执行。
    但是,用Delphi写一个程序调用B.dll,却出现错误,给出的错误信息是EssApin.dll模块中出现"Access Violation"。调用B.dll使用 过external关键字、LoadLibrary函数这2种方法,但是错误依旧。
    
    疑点:
    1.为什么B.dll用VC写的程序可以调用,而Delphi写的却不行。
    2.为什么错误是出在EssApin.dll模块中,而不是B.dll模块中。
    
    郁闷中,请高手指点迷津,不胜感激。

解决方案 »

  1.   

    注意函数的堆栈调用约定(cdel或stdcall或register或其它)
      

  2.   

    VC中函数声明如下:
    __declspec(dllexport) long Ess_Login(char srvrName[],char userName[],char pswd[]);
    以上五个函数均调用essapin.dll的Export函数,这个程序以C方式编译成dll002.dll。Delphi中函数声明:
    function Ess_Login(const ServerName, UserName, PassWord: PChar): integer;stdcall;external 'dll002.dll';调用代码如下:
    Ess_Login(PChar('127.0.0.1'),PChar('db2admin'),PChar('abcd1234'));
    运行时出错不是在dll002.dll模块,而是在essapin.dll模块。再次强调,用VC调用dll002.dll没有出现错误。
    我现在倾向于认为是Delphi5和essapin.dll不兼容。
      

  3.   

    同意westfly(西翔) 的看法
    对Vc,C++生成的Dll的调用,一般用cdel或stdcall
      

  4.   

    to evilkid (流水不争先)
      问一下:只是在调用的时候出现的问题吗?是关于窗体的调用吗?我问的前提是dll的调用没有什么问题?也许你的问题我遇到过
      

  5.   

    问题已经解决了,是这样的:
    那几个EXPORT函数都是接受char[]类型的参数,用C程序调用时没什么问题,用delphi调用就不行了。我把dll改了一下,对每个参数都用strcpy考到函数的内部数组里,这样就再没出现过问题。
    我想,归根到底是我写的B.dll要调用的那个EssApin.dll对字符串的处理不好才造成了这些问题。