1.一个DLL中定义了多个允许调用的过程/函数,如何调用?
  我在已经编写了:
  exports
    funcTest1 index 1,  
    ProcTest1 index 2;
  这里如果加了“index x” 就编译不能通过,提示:Symbol "index" is specific a platform.
  我想这个index是不是就是给调用的函数/过程标识编号?好在程序中用'DLL1/Test.DLL','DLL2/Test.DLL'调用?也就是说'DLL1/Test.DLL'调用了funcTest1, 'DLL2/Test.DLL'调用了ProcTest1?2.看书上说,DLL分为两类“静态调用和动态调用”。书上也没细说。我想,使用DLL的一个重要原因之一就是可以使程序在加载时不用把所有代码加载进如内存。但是根据书上说的,“静态调用时,程序运行时就完成DLL加载工作”,这样的话还要DLL干吗呢?也许的我没看懂,希望DX指点一下。非常感谢!

解决方案 »

  1.   

    你可以直接用
    exports funcTest1,procTest1用全局钩子的时候必须要用到dll,
    dll不完全等同于exe,它不可以单独执行,是加载到程序的空间执行的
      

  2.   

    to  ghostmirror(BUPT):
    再请教一下:如果直接用exports funcTest1,procTest1, 那么我再调用DLL时如何制定到底是用到了那个过程/函数呢?如何制定?
    我再调用时是这么写的,是否也要改一下?
    procedure GetProc(s: string); far; external 'DLL1\Test.dll'  //调用FuncTest1
    function GetFunc(a, b: integer):integer; external 'DLL2\Test.dll'//调用 ProcTest1implementation
    ……
      

  3.   

    2、你的理解是错的。dll之所以能够节省空间,是因为它里面的代码资源能够被很多程序共享,而一开始所谓的“静态加载”并不一定是每个调用它的进程都要拷贝一份到自己的进程空间,更多的情况时在系统的dll cache里面把这个dll的引用值+1。即便真的是每次都拷贝一份,那么运行时空间是占用了,但是你发布exe的大小是不是缩减了呢?发布一个exe当然看不出来,发布n个很多不就节省了n-1份硬盘存储空间嘛?
      

  4.   

    否则调用的时候就出现“无法定位程序输入点GetFunc于动态链接库Test.dll上。”
      

  5.   

    to stanely(俺是邢她汉子),“更多的情况时在系统的dll cache里面把这个dll的引用值+1”是什么意思呢?我不是太懂理解,谢谢。那么这么说的话,那DLL静态调用和动态调用的区别在哪里呢?请教。谢谢。
      

  6.   

    1、
    exports
        funcTest1,   
        ProcTest1;
      

  7.   

    你只要把在程序里面定义输出时候的函数或者过程名和dll中名字一致就可以了
    此外在dll中你可以
    exports
        funcTest1 name f1,  
        ProcTest1 name f2;  可以用name进行改名字还有我觉得
    exports
        funcTest1 index 1,  
        ProcTest1 index 2;
    这样是正确的,是不是别的地方有问题??
      

  8.   

    恩,同意 stanely(俺是邢她汉子) (
    dll的好处是很多的,并且你再更新你的软件功能时候,只需要重新发布一下新的dll就可以你在网上查下相关资料,很多的
      

  9.   

    to ghostmirror(BUPT):
    其他地方没改动什么啊?只是在unit1里面写个这个函数/过程的定义。如果只是写:
    exports
      funcTest1, ProcTest1;
     
    在程序中调用时,如何指明调用哪个函数/过程呢?如果不指明的话,程序(不是DLL)运行时就出现“无法定位程序输入点GetFunc于动态链接库Test.dll上。”的错误。
    我想,调用时应该要指定调用的是那个函数/过程,否则程序怎么知道需要调用的是DLL的哪个过程呢?不知道我的理解对不对。
      

  10.   

    to ghostmirror(BUPT):
    昨天看了一些资料(包括大富翁的bbs离线资料库),好像都没有提到我这个问题的,或者是按书上的资料编,但是有问题(index).
      

  11.   

    to 楼主,动态调用就是在你调用loadlibrary的时候才加载。静态dll实在程序开始的时候无论你调用不调用,都会去映射你涉及到的dll,你可以理解成自动调用所有涉及到的dll的相关loadlibrary.
    看看pe文件结构你就明白了。