我用delphi调用vc6.0编的dll碰到一堆问题,一条条地问:
1:为什么程序退出时总会出“invalid pointer operation”及“runtimeerror 217 at 00413708”的错?
   有关代码:
    调用声明: 
     function show1Dlltry():integer ;cdecl;external 'dlltry1.dll'
   
Exports from dlltry.dll
  5 exported name(s), 5 export addresse(s).  Ordinal base is 1.
  Sorted by Name:
    RVA      Ord. Hint Name
    -------- ---- ---- ----
    00001005    1 0000 ??0CDlltry@@QAE@XZ
    00001014    2 0001 ??4CDlltry@@QAEAAV0@ABV0@@Z
    00001019    3 0002 ?fnDlltry@@YAHXZ
    0002E3E0    4 0003 nDlltry
    0000100F    5 0004 show1Dlltry

解决方案 »

  1.   

    dlltry.dll中的函数是怎么申明的??
      

  2.   

    dlltry.h中是这样的:#ifdef DLLTRY_EXPORTS
    #define DLLTRY_API __declspec(dllexport)
    #else
    #define DLLTRY_API __declspec(dllimport)
    #endif
    extern "C" DLLTRY_API int show1Dlltry(void);dlltry.cpp中是这样的:DLLTRY_API int show1Dlltry(void)
    {MessageBox(NULL,"Hello world","Try",MB_OK);
     return 0;
    }
      

  3.   

    没看出来,改成function show1Dlltry():integer ;stdcall;external 'dlltry1.dll'看看
      

  4.   

    function show1Dlltry: integer;external 'dlltry1.dll';
      

  5.   

    Function functionname(argment):Boolean;far;External 'DllName'; http://tech.tom.com/Archive/2001/10/31-8851.html
      

  6.   

    To vargent77(地平线) ,dext(德克斯特) 
      试过了,结果一样。
      可以正确调用,但是程序退出时将非法操作。
      

  7.   

    To jemmylau(枕头) :
      谢谢你贴的文章。但是问题仍然存在……
      按文章说法,这种delphi下调用vc++编的dll最好用动态调用。经尝试,还是在退出时出现同样的错误。
      

  8.   

    1. VC 默认 cdecl 方式
    2. 不要试图一边申请内存,一边释放
       通俗的说,就是谁(EXE 和 DLL)申请的内存谁释放
      

  9.   

    在各位的帮助下,这个问题已经基本解决,其实是我错误地uses了一个单元所致,在原有条件下,不论静态还是动态都运行得很好 ^_^下一个问题:
    如果把vc里的函数声明从
                 extern "C" DLLTRY_API int show1Dlltry(void);
    改为
                 extern     DLLTRY_API int show1Dlltry(void);
    那么用tdump看到的将是这样:Exports from dlltry.dll
      5 exported name(s), 5 export addresse(s).  Ordinal base is 1.
      Sorted by Name:
        RVA      Ord. Hint Name
        -------- ---- ---- ----
        00001005    1 0000 ??0CDlltry@@QAE@XZ
        0000100F    2 0001 ??4CDlltry@@QAEAAV0@ABV0@@Z
        00001019    3 0002 ?fnDlltry@@YAHXZ
        0002E3E0    4 0003 ?nDlltry@@3HA
        00001014    5 0004 ?show1Dlltry@@YAHXZ然后在delphi里调用时用
      function show1Dlltry: integer;external 'dlltry1.dll';这样的声明会出现无法定位的错误。
      我只得改用function show1Dlltry: integer;external 'dlltry1.dll' index 5
            或  function show1Dlltry: integer;external 'dlltry1.dll' name '?show1Dlltry@@YAHXZ'
        的方式。那么有别的方法吗?
        在Behard(我爱天安门)的文章中提到这是所谓的名字分解,但是不够详细,具体情况能详细一点地说说吗?
      

  10.   

    VC端改成
    extern "C" long CALLBACK EXPORT func()形式Delphi端用stdcall
      

  11.   

    你指的是什么别的方法呢?(动态声明?)
    我推荐
    function show1Dlltry: integer;external 'dlltry1.dll' index 5
    速度较快
      

  12.   

    对不起了各位,我这段时间忙得没工夫上来看。
    下面继续:
    To :Behard(我爱天安门) 
       我对名字分解想多了解一些,诸如为什么要名字分解,什么情况下应该使用名字分解,分解和不分解对调用有什么影响,各有什么优缺点,是怎样名字分解的。以上问题均针对delphi调用VC编写的dll。
       就目前看来,我的理解是似乎不分解的时候才可以简单地使用function show1Dlltry: integer;external 'dlltry1.dll'来静态调用dll中函数。分解后的名字奇奇怪怪的。
       另外谢谢lazycat818(lazycat818)与dext(德克斯特)的热心。
      

  13.   

    是你的DLL编写的有问题,虽然声明的时候show1Dlltry()但是事实上可能会变名称的,你可以用dll导出工具查看你的dll就明白了!
      

  14.   

    vc中有很多声明dll调用的方法,但是楼主用的这种DLLTRY_API __declspec方式在delphi对应的声明方式我还真不记得了不过你可以使用stdcall方式声明_stdcall int show1Dlltry(void)
    {MessageBox(NULL,"Hello world","Try",MB_OK);
     return 0;
    }调用function show1Dlltry():integer ;stdcall;external 'dlltry1.dll'看看
    应该没什么问题了
      

  15.   

    csdn的数据丢了好多啊。
    谢谢楼上这位,我现在已经会调用了,不过我后来的问题还是没人答……
    醒目起见,再贴一遍:
      关于“名字分解”的问题:为什么要名字分解,什么情况下应该使用名字分解,分解和不分解对调用有什么影响,各有什么优缺点,是怎样名字分解的。以上问题均针对delphi调用VC编写的dll。
       就目前看来,我的理解是似乎不分解的时候才可以简单地使用function show1Dlltry: integer;external 'dlltry1.dll'来静态调用dll中函数。分解后的名字奇奇怪怪的。各位千万不要谦虚啊,多多指教^_^
      

  16.   

    对于 Delphi 调用 VC 的 Dll,你可以参考这个帖子
    http://community.csdn.net/Expert/topic/3086/3086143.xml?temp=.1206324名字分解,有时也称"修饰名字",是为C++中使用重载函数而创建的。在C++中可以有几个参数不同而名字相同的函数。一个最常见的是构造函数。
    但是如果你下模块想链接到C模块时不允许出现名字分解的函数。
    这样就是 extern “C”了
      

  17.   

    我不会 Delphi 的,所以我很少上这个板块的^_^ 我使用 BCB 的