飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 5432|回复: 5

[Delphi] 内存加载模块 -- 飘云测试通过

[复制链接]
  • TA的每日心情
    开心
    2024-12-1 11:04
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    发表于 2014-2-5 00:34:42 | 显示全部楼层 |阅读模式
    经过测试,非常稳定,32/64bit通用   我封装了几个函数,大家可以直接使用!!
    DLL:

    1. #include <windows.h>
    2. #include "MyDll.h"

    3. int  _stdcall AddFun(int a, int b)
    4. {
    5.         return a + b;
    6. }

    7. void  _stdcall GotoPYG(char *url)
    8. {
    9.         ShellExecute(NULL,"open", url, "", "", SW_SHOW );
    10. }

    11. //MyDll.def
    12. LIBRARY MyDll
    13. EXPORTS
    14. AddFun
    15. GotoPYG
    复制代码

    EXE:

    1. // 函数原型
    2. type
    3.   TAddFunc = function(a, b: Integer): Integer; stdcall;
    4.   TGotoPYGFunc = function(url: PChar): Boolean; stdcall;
    5. implementation

    6. uses
    7.   BTMemoryModule;

    8. {$R *.dfm}

    9. {$R MyDll.RES}

    10. {-------------------------------------------------------------------------------
    11.   过程名:    GetMemoryDllPointer
    12.   作用:      获取内存DLL指针
    13.   作者:      piaoyun
    14.   日期:      2013.12.20
    15.   参数:      const ResName: string;[资源名] ResType: PChar[资源类型]
    16.   返回值:    Pointer[内存DLL指针]
    17. -------------------------------------------------------------------------------}
    18. function GetMemoryDllPointer(const ResName: string; ResType: PChar): Pointer;
    19. var
    20.   MemoryStream: TResourceStream;
    21.   lpDllData: Pointer;  // 若要保险起见,请把此指针放到全局 最后释放
    22.   dwDllDataSize: DWORD;
    23. begin
    24.   MemoryStream := TResourceStream.Create(HInstance, ResName, ResType);
    25.   try
    26.     dwDllDataSize := MemoryStream.Size;
    27.     lpDllData := GetMemory(dwDllDataSize);
    28.     MemoryStream.Read(lpDllData^, dwDllDataSize);
    29.   finally
    30.     MemoryStream.Free;
    31.   end;
    32.   Result := BTMemoryLoadLibary(lpDllData, dwDllDataSize);
    33.   // 上面函数似乎已经完全拷贝了,可以释放
    34.   FreeMemory(lpDllData);
    35. end;

    36. {-------------------------------------------------------------------------------
    37.   过程名:    GetMemoryDllFunPointer
    38.   作用:      获取内存DLL某导出函数指针
    39.   作者:      piaoyun
    40.   日期:      2013.12.20
    41.   参数:      const ResName: string;[资源名] ResType: PChar[资源类型]
    42.   返回值:    Pointer[内存DLL导出函数指针]
    43. -------------------------------------------------------------------------------}
    44. function GetMemoryDllFunPointer(lpMemoryPointer: Pointer; FunName: PChar): Pointer;
    45. begin
    46.   Result := BTMemoryGetProcAddress(PBTMemoryModule(lpMemoryPointer), FunName);
    47. end;

    48. {-------------------------------------------------------------------------------
    49.   过程名:    FreeMemoryDll
    50.   作用:      释放内存DLL
    51.   作者:      piaoyun
    52.   日期:      2013.12.20
    53.   参数:      lpMemoryPointer: Pointer
    54.   返回值:    无
    55. -------------------------------------------------------------------------------}
    56. procedure FreeMemoryDll(lpMemoryPointer: Pointer);
    57. begin
    58.   if lpMemoryPointer <> nil then
    59.     BTMemoryFreeLibrary(PBTMemoryModule(lpMemoryPointer));
    60. end;

    61. procedure Test();
    62. var
    63.   lpMemoryPointer: Pointer;
    64.   AddFun: TAddFunc;
    65.   GotoPYGFun: TGotoPYGFunc;
    66. begin
    67.   lpMemoryPointer := GetMemoryDllPointer('MYDLL', 'DLL');
    68.   AddFun := GetMemoryDllFunPointer(lpMemoryPointer, 'AddFun');
    69.   GotoPYGFun := GetMemoryDllFunPointer(lpMemoryPointer, 'GotoPYG');
    70.   if Assigned(AddFun) then
    71.     ShowMessage(IntToStr(AddFun(10 ,20)));
    72.   if Assigned(GotoPYGFun) then
    73.     GotoPYGFun('https://www.chinapyg.com');
    74.    
    75.   FreeMemoryDll(lpMemoryPointer);
    76. end;

    77. procedure TForm1.btnTestClick(Sender: TObject);
    78. begin
    79.   Test;
    80. end;
    复制代码

    BTMemoryModule.rar (5.13 KB, 下载次数: 29)

    PYG19周年生日快乐!
  • TA的每日心情
    开心
    昨天 15:35
  • 签到天数: 1637 天

    [LV.Master]伴坛终老

    发表于 2014-2-7 10:42:15 | 显示全部楼层
    学习一下,好资源。
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2015-9-18 09:23
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2015-1-26 15:11:54 | 显示全部楼层
    研究一下 感谢!感谢!
    PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2016-9-22 10:07
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2016-6-27 11:16:46 | 显示全部楼层
    支持一个,就是不知道能不呢公用啊!
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-7-3 18:15
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2016-7-1 17:42:02 | 显示全部楼层
    学习一下,好资源。
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-12-5 13:57
  • 签到天数: 348 天

    [LV.8]以坛为家I

    发表于 2024-2-13 11:31:41 | 显示全部楼层
    学习一下,好资源。
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表