טען DLL ממשאב ישירות מהזיכרון

רעיון מאמר מאת מארק אי. מוס

המאמר כיצד לאחסן DLL בתוך קובץ exe של תוכנית Delphi כמשאב מסביר כיצד ניתן לשלוח DLL עם קובץ ההפעלה של יישום Delphi כמשאב.

ספריות קישור דינמיות מכילים קוד או משאבים הניתנים לשיתוף, הם מספקים את היכולת של מספר יישומים לשתף עותק יחיד של שגרה (או משאב) המשותפים להם.

באמצעות קבצי משאבים (.RES), באפשרותך להטמיע (ולהשתמש) בקבצי קול, קטעי וידיאו, אנימציות ובאופן כללי יותר מכל סוג של קבצים בינאריים בהפעלה של דלפי.

טוען קבצי DLL מזיכרון

אם ניתן להשתמש ב- DLL המאוחסן ב- RES מבלי לשמור תחילה אותו במערכת הקבצים (דיסק קשיח)

על פי הכתבה טוען DLL מהזיכרון מאת יואכים באוך, זה אפשרי.

כך נראה יואכים בנושא: פונקציות ה- API של ברירת המחדל של חלונות טעינת ספריות חיצוניות לתוכנית (LoadLibrary, LoadLibraryEx) פועלות רק עם קבצים במערכת הקבצים. לכן אי אפשר לטעון DLL מהזיכרון. אבל לפעמים אתה זקוק בדיוק לפונקציונליות זו (למשל, אינך רוצה להפיץ הרבה קבצים או רוצה להקשות על הפירוק). דרכים לעקיפת הבעיה הנפוצה לבעיות זו הן קודם לכתוב את ה- DLL לקובץ זמני ולייבא אותו משם. כאשר התוכנית מסתיימת, הקובץ הזמני נמחק.

instagram viewer

הקוד במאמר שהוזכר הוא C ++, השלב הבא היה להמיר אותו לדלפי. למרבה המזל, זה כבר נעשה על ידי מרטין אופנוונגר (המחבר של DSPlayer).

מודול זיכרון מאת מרטין אופנוונגר הוא גרסה מורחבת של דלפי (וגם לזרוס) של C ++ של Joachim Bauch. מודול זיכרון 0.0.1. חבילת ה- zip כוללת את קוד המקור המלא של דלפי של MemoyModule (BTMemoryModule.pas). יתר על כן יש דלפי ומדגם הכלול כדי להדגים כיצד להשתמש בו.

טוען קובצי DLL ממשאבים מהזיכרון

אם DLL הדגמה מאוחסן כמשאב באמצעות קובץ RC:

DemoDLL RCDATA DemoDLL.dll
var
ms: TMemoryStream;
rs: TResourceStream;
התחל
אם 0 <> FindResource (hInstance, 'DemoDLL', RT_RCDATA) לאחר מכן
התחל
rs: = TResourceStream. צור (hInstance, 'DemoDLL', RT_RCDATA);
ms: = TMemoryStream. צור;
נסה
גברת. LoadFromStream (rs);
גברת. מיקום: = 0;
m_DllDataSize: = ms. גודל;
mp_DllData: = GetMemory (m_DllDataSize);
גברת. קרא (mp_DllData ^, m_DllDataSize);
סוף סוף
גברת. חינם;
rs. חינם;
סוף;
סוף;
סוף;
var
btMM: PBTMemoryModule;
התחל
btMM: = BTMemoryLoadLibary (mp_DllData, m_DllDataSize);
נסה
אם btMM = אפסלאחר מכן לבטל;
@m_TestCallstd: = BTMemoryGetProcAddress (btMM, 'TestCallstd');
אם @m_TestCallstd = אפסי, בצע הפלה;
m_TestCallstd ('זו שיחת זיכרון Dll!');
מלבד
Showmessage ('אירעה שגיאה בעת טעינת ה- dll:' + BTMemoryGetLastError);
סוף;
אם הוקצה (btMM) לאחר מכן BTMemoryFreeLibrary (btMM);
סוף;
  1. יש / צור קובץ DLL
  2. אחסן את ה- DLL בקובץ RES
  3. שיהיה יישום BTMemoryModule.
  4. תפוס את ה- DLL מהמשאב וטען אותו ישירות לזיכרון.
  5. השתמש בשיטות BTMemoryModule כדי לבצע נוהל מ- DLL בזיכרון.

BTMemoryLoadLibary בדלפי 2009, 2010,...

"BTMemoryModule.pas המקושר לא עובד עם דלפי 2009 (והייתי מניח שגם דלפי 2010).
מצאתי גרסה דומה לקובץ BTMemoryModule.pas לפני זמן מה, וביצעתי שינויים כך שהיא תעבוד עם (לפחות) דלפי 2006, 2007 ו -2009. ה- BTMemoryModule.pas המעודכן שלי, ופרויקט לדוגמה, נמצאים ב- BTMemoryLoadLibary לדלפי> = 2009"
instagram story viewer