我在delphi里面调用vc写的动态连接库,每次调用完都会出现内存违规操作。怎么回事???

解决方案 »

  1.   

    不好意思程序太长,我在delphi里面社断点可以看出,在执行到调用函数的后没有问题,宜昌是出现在调用动态连接库函数的delphi函数退出的时候出的问题。
      

  2.   

    将你的Delphi和vc中如何声明函数定义的句子贴出来看看
      

  3.   

    我找到一个详细的说明,看看对你有无帮助:
    1、将多Dll文件拷到Systems下;
    2、在Implementation后调用就可以了例如:
    Function CAN_Open():Integer;stdcall;external 'Win32can.dll' ;
    3 、Delphi 支持五种调用模式:register、cdecl、pascal、stdcall和safecall。根据调用模式的不同,参数可以通过CPU的寄存器或堆栈传递给函数和过程。register模式使用CPU的三个寄存器传递参数,而其它模式则用堆栈来传递参数。在register和pascal模式下从左至右传递参数,即参数表中最左边的参数最先被求值并传递,而最右边的参数最后求值并传递。另三种模式cdecl、stdcall和safecall则从右至左传递参数。这些模式中除了cdecl外,都是由过程和函数在返回时清除堆栈中的参数,而对于cdecl模式,需由调用者在调用结束时清除堆栈中的参数。
      如何选择调用模式,有以下三条规则:
      1.Delphi 3.0使用register模式作为缺省调用模式以提高运行效率。
      2.如果有调用关系的几个模块是用不同语言编写的,其接口应使用stdcall模式。
    3.如果要实现双界面函数和过程,应使用safecall模式。
      所以解决我们的问题只要选用stdcall模式即可,Schlumberger公司的《编程指南》上在Microsoft C环境下的DLL函数说明(仅举两例)为:
      void(FAR PASCAL *Imp_ Connect)(unsigned short far*,short far*);
      void(FAR PASCAL *Imp_ Init)(short far*,short far*);
      相应的在Delphi 3.0下DLL函数引入说明为:
      procedure Imp_ Connect(var CardAddress:word;var CardHandle:smallint);stdcall;
      procedure Imp_ Init(var Poll_Tab:smallint;var ErrorFlag:smallint;var CardHandle:smallint);stdcall;
      

  4.   

    vc
    extern "C" __declspec( dllexport ) void  IniFile(Datalist* result,LPCSTR filename);delphi
    type myfun = procedure( list : pDatalist;  filename : PChar);stdcall;
    var
    casefun:myfun;
    begin
    Handle := Loadlibrary('d:\\libcase.dll');
    if myHandle<>0 then
    begin
     getmem(caselist,sizeof(datalist));
     @casefun := GetProcAddress(myHandle, 'IniFile');
     if @casefun<>nil then
     begin
       casefun(caselist, 'd:\\00200049.str');
     end;
    end;
    FreeLibrary(myHandle);datalist为结构
      

  5.   

    哈哈~难怪出错。
    你VC中没有指定__stdcall。默认是cdecl,参数压栈顺序不一样啊。
      

  6.   

    getmem(caselist,sizeof(datalist));
     try
       @casefun := GetProcAddress(myHandle, 'IniFile');
       if @casefun<>nil then 
       begin
         casefun(caselist, 'd:\\00200049.str');
       end;
     finally
       FreeMem(CaseList);
     end;
      

  7.   

    忘声明一点了,我在delohi的字符界面下的程序可以很好的调用,但同样的代码我在window
    界面下面用button触发调用才会出错。
      

  8.   

    Eastunfail:这两个不都是从右到左吗?
      

  9.   

    type myfun = procedure( list : pDatalist;  filename : PChar);cdecl;压栈是一样
    但是出栈的处理不一样,一个是由调用者处理,一个是由被调用者处理