dll的动态加载

                              dll的动态加载


        dll的加载方式有两种:隐式链接和动态加载。隐式链接,需要包含头文件,引用.lib文件才能使用导出函数。动态加载,直接使用LoadLibrary加载所需的动态库,然后指定所需的导出函数。一般情况下,两种方式都是可行的。如果我们没有头文件和.lib文件,只有dll,使用第二种方法是比较通用的作法。举例如下:
    现有test.dll,有如下一些导出函数:
    void func1(int a,int b);
    int func2(int a,double b);
    int func3(int* a,int* b);
    //加载dll

    HINSTANCE dllHinstance = LoadLibraryEx(dllFullName, NULL,    LOAD_WITH_ALTERED_SEARCH_PATH);
    //dllFullName为包含路径的dll名称

    //定义函数指针类型

    typedef void(__stdcall *PROC1)(int,int);
    typedef int(__stdcall *PROC2)(int,double);
    typedef int(__stdcall *PROC3)(void*,int);//对于不能确定类型的指针用void*代替

    //声明函数指针类型变量
    PROC1 myProc1;
    PROC2 myProc2;
    PROC3 myProc3;

    //获取函数指针存入对应变量

    myProc1 = (PROC1) GetProcAddress(dllHinstance, "func1");
    myProc2 = (PROC2) GetProcAddress(dllHinstance, "func2");
    myProc3 = (PROC3) GetProcAddress(dllHinstance, "func3");
  
   int a = 10;
   int b = 5;

   // 调用func1
   (*myProc1)(a,b);

   // 调用func2

   int c = (*myProc2)(a,(double)b);

    // 调用func3

    c = (*myProc3)(&a,&b);

    //调用完毕卸载dll

    FreeLibrary(dllHinstance);

 

      如果导出函数个数较多,或者导出函数被多次调用的情况下,可以构造头文件,通过宏的展开获取函数指针。如果dll被多次调用的话,伴随着宏多次展开的时间开销是一个不可忽略的因数。另外可借助专门工具对应生成.lib文件,采用隐式链接的方式加载。 如上所述,两种方法各有优劣,根据实际情况合理取舍。


 

程序加载了一个DLL文件,但生成的EXE在脱离了DLL文件后仍然可以 单独使用,这是动态加载DLL技术。即:调用资源DLL。 此技术的好处:EXE可以使用DLL函数,但不会额外增加一 个DLL文件,在使用DLL文件的时候不需要先把DLL释放到硬盘。 在动态加载的这个DLL定义了一个函数MRun,该函数可以动态执行一 个EXE,即:调用资源的EXE文件或TMemoryStream被载入的EXE流。 此技术的好处:直接把资源的EXE加载到内存执行,使用程序自 身嵌入的EXE文件的时候不需要先把EXE释放到硬盘上就可以直接执行。 对保密EXE文件很有用。例如:我编写的程序是A.exe,它在运行后需要 使用B.exe,而B.exe是别人编写的我没有源码,但我必须又要在我的程 序用B.exe,这时我就把它包含到我的A.exe,这个非常容易做到, 但是,程序A.exe在使用程序B.exe的时候按照常理必须先把B.exe释放 到硬盘上才可以用WinExec或ShellExecute等函数调用它,但你在释放 到硬盘上的时候容易被别人直接复制走,而你只想让别人用你的A.exe不 想让别人直接用B.exe(因为B.exe是别人写的等原因),此时如何保密 B.exe呢?这时只要用到上面所说的MRun函数就可以了,程序A.exe在执 行B.exe的时候不需要释放到硬盘上就可以直接执行B.exe啦,是不是很爽? 说一下MRun的调用方式: MRun(流,参数,进程id); 调用成功返回True,失败返回False,三个参数解释如下: 第一个参数:一个载入了EXE的资源流或者内存流等流类型。 第二个参数:传递调用EXE的参数。如果EXE调用不需要参数,可设置为空串。 第三个参数:如果调用成功,则返回被调用的EXE对应的进程ID。 细节性问题,请直接双击Project1.dpr文件进入演示代码,了解更多。演示代 码动态加载了MemRun.dll文件,动态调用了5555044.exe文件,如果你想更换 动态调用的EXE文件,只需要用其它EXE覆盖5555044.exe文件并双击Clear.bat 文件后,在Delphi按F9重新编译运行即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值