ውስብስብ delphi dlls የመፍጠር ምሳሌዎች. በዴልፊ ውስጥ ዲኤልኤልዎችን መፍጠር እና መጠቀም (DLL ዎችን ከፕሮግራሞች ጋር ማያያዝ ፣ ተለዋዋጭ ጭነት)። DLL የመተግበሪያ ቦታዎች

በፕሮግራም አወጣጥ ቴክኖሎጂዎች ፈጣን እድገት ምክንያት ቁጥራቸው እየጨመረ የመጣ ሰዎች የፕሮግራሞቻቸውን አቅም የማሳደግ ችግር ይጋፈጣሉ። ይህ መጣጥፍ በትክክል ለዚህ ጉዳይ ማለትም በቦርላንድ ዴልፊ ውስጥ የዲኤልኤል ፕሮግራም አወጣጥ ነው። በተጨማሪም፣ ከዲኤልኤል አጠቃቀም ጋር በተያያዙ ጉዳዮች ላይ ስለምንነካ፣ ከውጭ DLLs (ሲስተሞችን፣ ማለትም WinAPIን ጨምሮ) ተግባራትን ማስመጣትን እንነካለን።

DLL የመተግበሪያ ቦታዎች

ስለዚህ፣ DLLs ለምን ያስፈልጋሉ እና የት ጥቅም ላይ ይውላሉ?... እስቲ አንዳንድ የመተግበሪያቸውን አካባቢዎች እንዘርዝራቸው፡

  • የግለሰብ ቤተ-መጻሕፍትለፕሮግራም አውጪዎች ጠቃሚ መረጃ የያዘ ተጨማሪ ባህሪያት. ለምሳሌ፣ ከሕብረቁምፊዎች ጋር ለመስራት ተግባራት፣ ወይም ምስሎችን ለመለወጥ ውስብስብ ቤተ-መጻሕፍት።
  • የንብረት ማከማቻ. ዲኤልኤል ፕሮግራሞችን እና ተግባራትን ብቻ ሳይሆን ሁሉንም አይነት ሀብቶችን - አዶዎችን ፣ ሥዕሎችን ፣ የሕብረቁምፊዎችን ፣ ምናሌዎችን ፣ ወዘተ ማከማቸት ይችላል ።
  • ቤተ መጻሕፍት ድጋፍ. ለአብነት ያህል፣ እንደነዚህ ያሉትን ቤተ መጻሕፍት መጥቀስ እንችላለን ታዋቂ ጥቅሎች፣ እንዴት፥ DirectX, ICQAPI(ኤፒአይ ለ ICQ)፣ ጂኤልን ክፈትወዘተ.
  • የፕሮግራሙ ክፍሎች. ለምሳሌ, የፕሮግራም መስኮቶችን (ፎርሞችን) ወዘተ በዲኤልኤል ውስጥ ማከማቸት ይችላሉ.
  • ተሰኪዎች(ፕለጊኖች)። - የፕሮግራም ሰሪ ሀሳቦች ትክክለኛ ወሰን እዚህ ላይ ነው! ፕለጊኖች አቅሙን የሚያሰፋ ፕሮግራም ተጨማሪዎች ናቸው።
  • ለምሳሌ, በዚህ ጽሑፍ ውስጥ ለእራስዎ ፕሮግራም ፕለጊን የመፍጠር ንድፈ ሃሳብ እንመለከታለን.የጋራ መገልገያ . ዲኤልኤል (ተለዋዋጭ አገናኝቤተ መፃህፍት ) በአንድ ጊዜ በበርካታ ፕሮግራሞች ወይም ሂደቶች መጠቀም ይቻላል (የሚባሉት.ማጋራት።

- የጋራ መገልገያ)

ከ DLLs ጋር ለመስራት የተግባሮች እና ቴክኒኮች አጭር መግለጫ

ስለዚህ ከ DLLs ጋር ለመስራት ምን አይነት ቴክኒኮችን እና ተግባራትን መጠቀም ያስፈልግዎታል? ተግባራትን ከቤተ-መጽሐፍት ለማስመጣት ሁለት መንገዶችን እንመልከት።. 1 መንገድዲኤልኤልን ከአንድ ፕሮግራም ጋር ማያያዝ። ይህ በጣም ቀላሉ እናቀላል ዘዴ ከ DLLs የመጡ ተግባራትን ለመጠቀም። ነገር ግን (ይህም ልብ ሊባል የሚገባው) ይህ ዘዴ በጣም ጉልህ የሆነ ጉድለት አለው - ፕሮግራሙ የሚጠቀመው ቤተ-መጽሐፍት ካልተገኘ, ፕሮግራሙ በቀላሉ አይጀምርም, ስህተት በመስጠት እና የዲኤልኤል ሃብቱ እንዳልተገኘ ሪፖርት ያደርጋል. እና የቤተ-መጽሐፍት ፍለጋው ይከናወናል: ውስጥየአሁኑ ማውጫ
, በፕሮግራሙ ማውጫ ውስጥ, በ WINDOWS\SYSTEM ማውጫ ውስጥ, ወዘተ. ስለዚህ ፣ ለመጀመር -አጠቃላይ ቅርጽ

ይህ ዘዴ:
...
ትግበራየተግባር ስም (አንቀፅ 1: Par1Type; Par2: Par2Type; ...): የመመለሻ አይነት; stdcall; ውጫዊ"DLLNAME.DLL" ስም"የተግባር ስም" ኢንዴክስ FuncIndex;
// ወይም (ተግባር ካልሆነ ግን አሰራር)
ሂደትየአሰራር ስም (አንቀፅ 1: Par1Type; Par2: Par2Type; ...); stdcall; ውጫዊ"DLLNAME.DLL" ስም"የአሰራር ስም" ኢንዴክስ ProcIndex;

እዚህ፡ የተግባር ስም(ወይም የሂደቱ ስም) - በፕሮግራምዎ ውስጥ ጥቅም ላይ የሚውለው ተግባር (ወይም አሰራር) ስም;
Par1፣ Par2፣...- የተግባር ወይም የአሠራር መለኪያዎች ስሞች;
Par1Type፣ Par2Type፣...- የተግባር ዓይነቶች ወይም የአሠራር መለኪያዎች (ለምሳሌ ፣ ኢንቲጀር);
የመመለሻ አይነት- የመመለሻ እሴት ዓይነት (ለተግባር ብቻ);
stdcall- በዲኤልኤል እራሱ ውስጥ ጥቅም ላይ ከዋለ ጋር በትክክል መመሳሰል ያለበት መመሪያ;
ውጫዊ "DLLNAME.DLL"- ከውጭ የሚመጣበትን የውጭ DLL ስም የሚገልጽ መመሪያ ይህ ተግባርወይም ሂደት (በ በዚህ ጉዳይ ላይ - DLLNAME.DLL);
ስም "የተግባር ስም" ("Procedure Name")- በዲኤልኤል እራሱ ውስጥ የተግባሩን ትክክለኛ ስም የሚያመለክት መመሪያ። ይህ አንድ ተግባር ከእውነተኛ ስሙ (በላይብረሪ ውስጥ ያለው) ሌላ ስም ባለው ፕሮግራም ውስጥ ጥቅም ላይ እንዲውል የሚያስችል አማራጭ መመሪያ ነው።
ኢንዴክስ ተግባር ኢንዴክስ(ProcedureIndex)- የሚያመለክት መመሪያ ተከታታይ ቁጥርተግባራት ወይም ሂደቶች በዲኤልኤል. ይህ ደግሞ አማራጭ መመሪያ ነው።

ዘዴ 2. የDLLs ተለዋዋጭ ጭነት።ይህ በጣም የተወሳሰበ, ግን የበለጠ የሚያምር ዘዴ ነው. የመጀመሪያው ዘዴ ጉዳት የለውም. ብቸኛው ደስ የማይል ነገር ይህንን ዘዴ ለመተግበር የሚያስፈልገው ኮድ መጠን ነው, እና አስቸጋሪው ነገር ከዲኤልኤል የመጣው ተግባር ይህ ዲኤልኤል ሲጫን እና በማስታወሻ ውስጥ ብቻ ነው ... አንድ ምሳሌ ከዚህ በታች ሊገኝ ይችላል, ግን ለአሁኑ - አጭር መግለጫየWinAPI ተግባራት በዚህ ዘዴ ጥቅም ላይ ይውላሉ

ሎድላይብረሪ(ሊብፋይል ስም፡- PChar) - የተገለጸውን ቤተ-መጽሐፍት LibFileName ወደ ማህደረ ትውስታ ይጭናል. በተሳካ ሁኔታ ሲጠናቀቅ ተግባሩ እጀታውን ይመልሳል ( ተንበርክኮ) በማህደረ ትውስታ ውስጥ DLL.
GetProcAddress(ሞዱል፡- ተንበርክኮ; ስም፡ PChar) - ወደ ውጭ የተላከውን የቤተ-መጽሐፍት ተግባር አድራሻ ያነባል። በተሳካ ሁኔታ ሲጠናቀቅ ተግባሩ እጀታውን ይመልሳል ( TFarProc) በተጫነው DLL ውስጥ ያሉ ተግባራት.
ነፃ ቤተ-መጽሐፍት(ሊብ ሞዱል፡- ተንበርክኮ) - LibModule ን ያጠፋዋል እና ከእሱ ጋር የተገናኘውን ማህደረ ትውስታ ነጻ ያወጣል. ይህንን አሰራር ከጠራ በኋላ የዚህ ቤተ-መጽሐፍት ተግባራት ከአሁን በኋላ እንደማይገኙ ልብ ሊባል ይገባል.

ልምምድ እና ምሳሌዎች

ደህና ፣ ከላይ የተጠቀሱትን ዘዴዎች እና ዘዴዎች በመጠቀም ሁለት ምሳሌዎችን ለመስጠት ጊዜው አሁን ነው-

አሁን ተመሳሳይ ነገር, ግን በሁለተኛው መንገድ - በተለዋዋጭ ጭነት:

(...የፋይል ራስጌው እና የቅጹ TForm1 ትርጉም እና የምሳሌው ቅጽ1 እዚህ አለ)

var
ቅፅ1፡ TForm1;
ቀላል ጽሑፍ፡- ትግበራ( ላንግረስ፡ ቡሊያን)፡ PChar;
ልብሃንድል፡ ታንደል;

የአሰራር ሂደት Button1Click (ላኪ: TObject);
ጀምር
(የተግባር አድራሻውን ከ "ቆሻሻ" በማጽዳት ላይ)
@GetSimpleText:= nil;
(ላይብረሪውን ለመጫን እየሞከርን ነው)
LibHandle:= LoadLibrary("MYDLL.DLL");
(ሁሉም ነገር ደህና ከሆነ)
LibHandle >= 32 ከሆነ ከዚያ ይጀምሩ
(...ከዚያ በቤተ-መጽሐፍት ውስጥ የተግባሩን አድራሻ ለማግኘት እየሞከርን ነው)
@GetSimpleText:= GetProcAddress(LibHandle"GetSimpleText");
(እዚህም ሁሉም ነገር ደህና ከሆነ)
@GetSimple ጽሑፍ ከሆነ<>አይደለም እንግዲህ
(...ከዚያ ይህንን ተግባር ይደውሉ እና ውጤቱን ያሳዩ)
ShowMessage(StrPas(GetSimpleText(እውነት))));
መጨረሻ;
(እና ማህደረ ትውስታን ነጻ ማድረግ እና DLL ን ማውረድዎን አይርሱ)
ፍሪላይብረሪ(ሊብ ሃንድል);
መጨረሻ;

ማስታወሻ በቤተመጽሐፍት ተግባራት ውስጥ የሕብረቁምፊውን አይነት ከመጠቀም መቆጠብ አለብዎት ምክንያቱም ሲጠቀሙበት "የማህደረ ትውስታ መጋራት" ላይ ችግሮች አሉ። ዴልፊ በሚፈጥረው ባዶ የዲኤልኤል ፕሮጀክት (ፋይል -> አዲስ -> DLL) ስለዚህ ጉዳይ (በእንግሊዘኛ ቢሆንም) የበለጠ ማንበብ ይችላሉ። ስለዚህ PChar ን መጠቀም እና አስፈላጊ ከሆነ የStrPas ተግባርን በመጠቀም ወደ ሕብረቁምፊ መቀየር የተሻለ ነው።

ደህና፣ አሁን ዲኤልኤልን ራሱ እንይ፡-

መገልገያዎችን እና ቅጾችን በDLLs ውስጥ ማስቀመጥ

ዲኤልኤል ተግባራትን ብቻ ሳይሆን ጠቋሚዎችን፣ ስዕሎችን፣ አዶዎችን፣ ምናሌዎችን እና የጽሑፍ ሕብረቁምፊዎችን ሊይዝ ይችላል። በዚህ ላይ አናተኩርም። አንድን ግብአት ለመጫን ዲኤልኤልን መጫን እንዳለብህ ብቻ አስተውያለሁ፣ እና ገላጭውን ከተቀበልክ በኋላ ሀብቱን በተገቢው ተግባር (LoadIcon፣ LoadCursor፣ ወዘተ) ይጫኑ። በዚህ ክፍል፣ በዲኤልኤል ዎች ውስጥ የአፕሊኬሽን መስኮቶችን (ማለትም በዴልፊ ውስጥ ያሉ ቅጾችን) አቀማመጥን በአጭሩ እንነካለን።

ይህንን ለማድረግ አዲስ DLL መፍጠር እና በእሱ ላይ ማከል ያስፈልግዎታል አዲስ ዩኒፎርም(ፋይል -> አዲስ -> DLL, እና ከዚያ ፋይል -> አዲስ ቅጽ). በመቀጠል ቅጹ የንግግር ሳጥን ከሆነ ( ሞዳል ቅርጽ(bsDialog))፣ ከዚያ የሚከተለውን ተግባር ወደ DLL ጨምሩ (ቅጹ ቅጽ 1 ተብሎ ይጠራል፣ ክፍሉ ደግሞ TForm1 ነው እንበል)

ሞዳል ያልሆነ ቅጽ በዲኤልኤል ውስጥ ማስቀመጥ ከፈለጉ ሁለት ተግባራትን መፍጠር ያስፈልግዎታል - ቅጹን መክፈት እና መዝጋት። በዚህ ሁኔታ, ለዚህ ቅጽ መያዣውን እንዲያስታውስ DLL ማስገደድ ያስፈልግዎታል.

ተሰኪዎችን መፍጠር

እዚህ ላይ ተሰኪዎችን በዝርዝር አንመለከትም፣ ምክንያቱም... ከላይ የተጠቀሱት ምሳሌዎች የ DLL ፕሮግራምን የአንበሳውን ክፍል በቀላሉ ለመረዳት ይረዳሉ። ፕለጊን አቅሙን የሚያሰፋ የፕሮግራሙ ተጨማሪ መሆኑን ብቻ ላስታውስህ። በተመሳሳይ ጊዜ, መርሃግብሩ እራሱ እንደነዚህ አይነት ተጨማሪዎች መገኘት እና ዓላማቸውን እንዲፈጽሙ መፍቀድ አለበት.

ማለትም ፣ ለምሳሌ ፣ ተሰኪ ለመፍጠር ግራፊክ አርታዒየምስል ልወጣን የሚያከናውን ፣ በተሰኪው ውስጥ ቢያንስ ሁለት ተግባራትን መስጠት ያስፈልግዎታል (እና በዚህ መሠረት በፕሮግራሙ ውስጥ እነዚህን ተግባራት ይደውሉ) - ይህ ተግባር የተሰኪውን ስም (እና/ወይም ዓይነቱን) የሚመልስ ተግባር ነው። ይህንን ፕለጊን ወደ ምናሌው (ወይም በመሳሪያ አሞሌው ውስጥ) ይጨምሩ ዋና ተግባር- ምስል ማስተላለፍ እና መቀበያ. እነዚያ። በመጀመሪያ ፕሮግራሙ ተሰኪዎችን ይፈልጋል ፣ ከዚያ ለእያንዳንዱ የተገኘ ሰው የመታወቂያ ተግባሩን በጥብቅ በተገለጸ ስም (ለምሳሌ ፣ GetPluginName) ጠርቶ ይጨምራል። የሚፈለገው ንጥልበምናሌው ውስጥ ፣ ከዚያ ፣ ተጠቃሚው ይህንን ንጥል ከመረጠ ፣ ሁለተኛው ተግባር ይጠራል ፣ የግቤት ምስሉን (ወይም ይህንን ምስል የያዘውን የፋይል ስም) ያስተላልፋል ፣ እና ይህ ተግባር ምስሉን ያስኬዳል እና በአዲስ መልክ (ወይም የፋይሉን ስም በአዲስ ምስል) ይመልሳል. የፕለጊኑ ፍሬ ነገር ያ ነው... :-)

ኢፒሎግ

ይህ ጽሑፍ በቦርላንድ ዴልፊ ውስጥ ዲኤልኤልን የመጠቀም እና የመፍጠር መሰረታዊ ነገሮችን ያሳያል። ጥያቄዎች ካሉዎት በኢሜል ይላኩልኝ፡- [ኢሜል የተጠበቀ], እና እንዲያውም የተሻለ - ሌሎች ተጠቃሚዎች ጥያቄዎን ለማየት እና ለመመለስ እንዲሞክሩ በዚህ ጣቢያ ላይ ባለው ኮንፈረንስ ላይ ይፃፉ!

ካሪክ ኒኮላይ። የሞስኮ ክልል, Zhukovsky

ተለዋዋጭ ቤተ መጻሕፍት፣ ወይም ዲኤልኤል, በመተግበሪያዎች ወይም በሌላ ሊጠሩ የሚችሉ ንዑስ ፕሮግራሞች (ትናንሽ ፕሮግራሞች) ስብስብ ነው ዲኤልኤል. እንደ ሞጁሎች ፣ ዲኤልኤልይዟል አጠቃላይ ኮድወይም በአንድ ጊዜ በብዙ መተግበሪያዎች በአንድ ጊዜ ሊጠቀሙባቸው የሚችሉ ሀብቶች ዲኤልኤል. በመሰረቱ ዊንዶውስ- ስብስብ ብቻ ነው። ዲኤልኤል.

በተፈጥሮ፣ ዴልፊን በመጠቀም፣ የራሳችንን መፃፍ እና መጠቀም እንችላለን ዲኤልኤልእና ተግባራትን ወደ ውስጥ መጥራት እንችላለን ዲኤልኤልበሌሎች ገንቢዎች እና በሌሎች ስርዓቶች (እንደ ቪዥዋል ቤዚክ ወይም ሲ/ሲ++).

ተለዋዋጭ ቤተ-መጽሐፍት መፍጠር

የሚቀጥሉት ጥቂት መስመሮች እንዴት ቀላል መፍጠር እንደሚችሉ ያሳያሉ ዲኤልኤልዴልፊን በመጠቀም።

ለጀማሪዎች ዶልፊስቶችከምናሌው ውስጥ መምረጥ ያስፈልግዎታል ፋይል | አዲስ...DLL. ይህ አዲስ አብነት ይፈጥራል ዲኤልኤልበአርታዒው መስኮት ውስጥ. ነባሪውን ጽሑፍ ይምረጡ እና በሚከተለው ኮድ ይተኩ፡

የቤተ መፃህፍት ሙከራ ቤተመጽሐፍት; SysUtils, ክፍሎች, መገናኛዎች ይጠቀማል; ሂደት DllMessage; ወደ ውጭ መላክ; ShowMessage ጀምር("ሄሎ አለም ከዴልፊ ዲኤልኤል" ; መጨረሻ; DllMessage ወደ ውጭ መላክ; መጨረሻ ጀምር።

የማንኛውንም የፕሮጀክት ፋይል ከተመለከቱ Delphi መተግበሪያዎችሲጀምር ታያለህ የተያዘ ቃል ፕሮግራም. ዲኤልኤልበአንጻሩ በተጠበቀ ቃል ይጀምራል ቤተ መፃህፍት. ከዚህ በኋላ አንድ አንቀጽ ይከተላል ይጠቀማልለማንኛውም የሚያስፈልጉ ሞጁሎች. በዚህ ቀላል ምሳሌ, ይህ በሚባል አሰራር ይከተላል Dll መልእክትቀላል መልእክት ከማሳየት ሌላ ምንም አያደርግም።

በዚህ ጽሑፍ መጨረሻ ላይ መመሪያ አለ ወደ ውጭ መላክ. ወደ ውጭ የሚላኩ የዕለት ተዕለት ተግባራት ዝርዝር እዚህ ጋር ተካትቷል። ዲኤልኤልእና በሌሎች መተግበሪያዎች ሊጠራ ይችላል. ይህ ማለት ለምሳሌ በ ዲኤልኤል 5 ሂደቶች እና 2 ብቻ ናቸው (በክፍል ውስጥ ተዘርዝረዋል ወደ ውጭ መላክ) ከ ሊጠራ ይችላል። ውጫዊ ፕሮግራሞች(ከመካከላቸው 3ቱ ንዑስ ክፍልች ናቸው። ዲኤልኤል).

ይህንን ቀላል ለመጠቀም ዲኤልኤል, ጠቅ በማድረግ ማጠናቀር አለብን Ctrl+F9. ይህ ለመፍጠር ነው። ዲኤልኤልበስም SimpleMessageDll.dllበፕሮጀክት አቃፊ ውስጥ.


አሁን የአሰራር ሂደቱን እንዴት እንደሚደውሉ እንይ Dll መልእክትከ (በስታቲስቲክስ የተጫነ) ዲኤልኤል.

በውስጡ የያዘውን አሰራር ለማስመጣት ዲኤልኤል, ቁልፍ ቃሉን እንጠቀማለን ውጫዊበሂደቱ መግለጫ ውስጥ. ለምሳሌ, የአሰራር መግለጫ Dll መልእክትቀደም ሲል የሚታየው ይህንን ይመስላል

ሂደት DllMessage; ውጫዊ "ቀላል መልእክትDLL.dll"

እና የሂደቱ ጥሪ ይህንን ይመስላል

Dll መልእክት;

ለቅጹ ሙሉ ኮድ ቅጽ 1ጋር ቲቢተንበስም አዝራር 1(ተግባሩን ለመጥራት Dll መልእክት) ይህን ይመስላል፡-

ክፍል 1; በይነገጽ ዊንዶውስ ፣ መልእክቶች ፣ SysUtils ፣ Variants ፣ ክፍሎች ፣ ግራፊክስ ፣ መቆጣጠሪያዎች ፣ ቅጾች ፣ መገናኛዎች ፣ StdCtrls ይጠቀማል። ዓይነት TForm1 = ክፍል (ቲፎርም) አዝራር 1: TButton;

የአሰራር ሂደት Button1Click (ላኪ: TObject);

የግል (የግል መግለጫዎች) ህዝባዊ (የህዝብ መግለጫዎች) ያበቃል; var ቅጽ1፡ TForm1;

ሂደት DllMessage; ውጫዊ "SimpleMessageDLL.dll" ትግበራ ($R *.dfm) አሰራር TForm1.Button1Click (ላኪ: TObject); startDllMessage; መጨረሻ; መጨረሻ። ዲኤልኤልይህ ሁሉ ነው! ቀላል ነው፣ ልክ በዴልፊ ውስጥ እንዳለ ሁሉ! ዲኤልኤልሰላም ውድ ባልደረቦች! በዚህ ጽሑፍ ውስጥ ለጥያቄዎቹ መልስ ለመስጠት እሞክራለሁ-ምንድን ነው.

? ለምንድነው? እና እንዴት መፍጠር እና መጠቀም እንደሚቻል?

በእርዳታውዴልፊ ዲኤልኤል DLL ምንድን ነው?

ተለዋዋጭ አገናኝ ቤተ-መጽሐፍት

ላይብረሪውን መጠቀም ይቻላል። የተለያዩ ቋንቋዎችፕሮግራሚንግ፣ የተጻፈበት ቋንቋ ምንም ይሁን ምን።

ቤተ-መጽሐፍት ለመፍጠር ወደ ምናሌው ይሂዱ ፋይል -> ሌላእና ይምረጡ ዴልፊ ፕሮጀክቶች -> ተለዋዋጭ-አገናኝ ቤተ-መጽሐፍት።.
ቤተ-መጽሐፍት ለመፍጠር አብነት ያለው የኮድ ጽሑፍ ይከፈታል፡-

የቤተ መፃህፍት ፕሮጀክት1; ሲስተም ይጠቀማል.SysUtils, System.Class; ($ R *.res) መጨረሻ መጀመሪያ።

የንብረት አቀማመጥ

በዋናው ፕሮግራም ውስጥ በኋላ የምንጠቀመውን አዶ ወደ ቤተ-መጽሐፍት እንጨምር።
በአንድ ፕሮጀክት ላይ መገልገያዎችን እንዴት መጨመር እንደሚቻል በአንቀጹ ውስጥ በዝርዝር ተገልጿል.

"ስለ ፕሮግራሙ" ቅጽ እንጨምር።
ጠቅ ያድርጉ ፋይል -> አዲስ -> የቪሲኤል ቅጽ. ጽሑፍ እና "እሺ" ቁልፍ እንጨምር፡-

ደረጃውን የሚያሳይ ተግባር እንጨምር መልእክት ሳጥንበጥያቄ, አዝራሮች "አዎ", "አይ" እና በቅጹ ውጤት እውነት ነው።ወይም ውሸት.

ተግባር YesNoDlg(const question፡ PChar): boolean; stdcall; የጀምር ውጤት፡= (የመልእክት ሳጥን(0፣ ጥያቄ፣ "ማረጋገጫ"፣ MB_YESNO + MB_ICONQUESTION) = ID_YES); መጨረሻ;

ለቁልፍ ቃሉ ትኩረት ይስጡ stdcall. ተግባራትን በሚደውሉበት ጊዜ መለኪያዎች እና ውጤቶች እንዴት እንደሚተላለፉ በትክክል ይወስናል. የጥሪ ስምምነት wiki ገጽ ላይ የበለጠ ማንበብ ይችላሉ።

ለዋናው ፕሮግራም እንደ ተሰኪ የሚያገለግል አሰራርን እንጨምራለን ። የፈጠርነውን መስኮት ለመክፈት "ስለ ፕሮግራሙ" የሚለውን ቁልፍ ወደ ዋናው የፕሮግራም ሜኑ ያክላል።
የአሰራር ኮድ፡-

የአሰራር PlugIn (ቅጽ: TForm); stdcall; var i: ኢንቲጀር;

ሚ፡ TMenuItem; ለመጀመር i:= 0 ወደ Form.ComponentCount - 1 ከ (Form.Components[i].Classname = "TMenuItem") እና (Form.Components[i].Name = "miHelp") ከጀመረ mi:= TMenuItem ይጀምራል ፍጠር (ቅጽ. ክፍሎች[i]); mi.Caption:= "ስለ ፕሮግራሙ"; mi.OnClick:= fmAbout.onAboutButton ክሊክ;

TMenuItem (ቅጽ. ክፍሎች[i]) .አክል (ማይ);
ውጣ;

መጨረሻ;

መጨረሻ; መጨረሻ; የፕሮግራሙ ቅፅ እንደ መለኪያ ወደ ሂደቱ ተላልፏል. "" የሚባል የምናሌ ንጥል ነገር እንዳለ እናረጋግጣለን። -> miHelp"እና ምናሌው ከተገኘ, ከዚያም የእኛን አዝራር በእሱ ላይ ይጨምሩ. አሁን የትኞቹን ተግባራት እና ሂደቶች ከቤተ-መጽሐፍታችን መጠቀም እንደሚቻል እንጠቁማለን. መስመሩን እንጨምር፡-.
PlugInን፣ YesNoDlgን ወደ ውጭ ይላካል; ዲኤልኤል.

ተግባሩን እናጠናቅቅ

ፕሮጀክት ይገንቡወይም በመጠቀም mi.Caption:= "ስለ ፕሮግራሙ";:

hotkey

Shift+F9 ዲኤልኤልበኮዱ ውስጥ ምንም ስህተቶች ከሌሉ ቅጥያው ያለው ፋይል በፕሮጀክቱ አቃፊ ውስጥ መታየት አለበት
አሁን የእኛን ቤተ-መጽሐፍት የሚጠቀም አፕሊኬሽን ወደ መፍጠር እንሂድ።በማመልከቻው ውስጥ ቅጽ እንፍጠር
ተለዋዋጭ- ቤተ መፃህፍቱ ከተግባር ጥሪ በፊት ወዲያውኑ ወይም በአንድ የተወሰነ ክስተት ተገናኝቷል።

የማይንቀሳቀስ የግንኙነት ዘዴን እንመልከት፡-

TfmMain = ክፍል (ቲፎርም) ዋና ሜኑ ይተይቡ፡ TMainMenu;

miProgram: TMenuItem; ውጫዊሚውጣ፡ TMenuItem;

miHelp: TMenuItem; የአሰራር ሂደት ቅጽ ፍጠር (ላኪ: TObject);ሂደት miExitClick (ላኪ: TObject); የግል ህዝባዊ መጨረሻ;:

የአሰራር ሂደት PlugIn (ቅጽ: TForm); stdcall; ውጫዊ "SampleDLL.dll"; ቫር...

ቁልፍ ቃል ይህ ተግባር ከውጭ ቤተ-መጽሐፍት የተገናኘ መሆኑን ያመለክታል.ለዝግጅቱ ፍጠር).

ቅጽ ፣ የሂደት ጥሪን ያክሉ

መሰካት

ሂደት TfmMain.FormCreate(ላኪ፡ TObject); PlugIn (ራስን) ይጀምሩ; መጨረሻ; እንደ መለኪያ:

ሎድላይብረሪ
ቅፅ

የአሁኑን ቅጽ ወደ ሂደቱ እናስተላልፋለን (ቁልፍ ቃል

እራስፕሮግራሙን ስንጀምር በዋናው ሜኑ ውስጥ “እገዛ” በሚለው ክፍል ውስጥ “ስለ ፕሮግራሙ” የሚለው ንጥል ሊኖረን ይገባል።

GetProcAddress
ወደ ተለዋዋጭ የግንኙነት ዘዴ እንሂድ። ሶስት ተግባራት ያስፈልጉናል.

ዊንአፒ

ቤተ መፃህፍቱን ወደ ኮምፒውተር ማህደረ ትውስታ ይጭናል. በዚህ ምክንያት ጠቋሚን በማህደረ ትውስታ ውስጥ ወደ ቤተ-መጽሐፍት ይመልሳል። ስህተት ከተፈጠረ 0 ይመለሳል።
LoadLibrary(lpLibFile ስም፡ LPCWSTR): HMODULE; lpLibFile ስም

ነፃ ቤተ-መጽሐፍት
- የቤተ-መጽሐፍት ፋይል ስም.

በቤተ-መጽሐፍት ውስጥ በስም አንድ ተግባር ያግኙ። ውጤቱ የተግባር ጠቋሚ ይሆናል. ተግባሩ ካልተገኘ, ይመለሳል

አይደለም GetProcAddress (hModule: HMODULE; lpProc ስም: LPCSTR): FARPROC;

hModule የ lpProc ስም- የተግባር ስም.
ቤተ መፃህፍቱን ከኮምፒዩተር ማህደረ ትውስታ ያወርዳል። ውጤቱ ከስኬት ጋር ሲወዳደር እውነት እና ስህተት ከሆነ ውሸት ይሆናል.

FreeLibrary(hLibModule፡ HMODULE): BOOL;

hLibModule - ለተጫነው ቤተ-መጽሐፍት ጠቋሚ።አሁን, ተለዋዋጭ ዘዴን በመጠቀም, ሀብቶችን, አዶችንን እናገኛለን እና የተግባር ጥሪ ወደ "ውጣ" ቁልፍ እንጨምራለን

ሂደት TfmMain.miExit ክሊክ (ላኪ፡ TObject); var DLLHandle፡ ታንድል;

Dlg፡ ተግባር(const question፡ PChar): boolean; stdcall; DLLHandle ጀምር:= LoadLibrary("SampleDLL.dll"); DLLHandle = 0 ከሆነ ከዚያ Exception.Create ከፍ ያድርጉ ("SampleDLL" ላይብረሪ ማካተት አልተቻለም!");ይሞክሩ @Dlg:= GetProcAddress(DLLHandle፣ "YesNoDlg");

ካልተመደበ (@Dlg) ከዚያም Exception.Create ከፍ ያድርጉ ("YesNoDlg" የሚባል ተግባር በቤተ-መጽሐፍት "SampleDLL" ውስጥ አልተገኘም!"); ዲኤልኤልከሆነ Dlg ("ከፕሮግራሙ ውጣ?") ከዚያም ዝጋ;
በመጨረሻም ፍሪሊብራሪ (DLLHandle);

ዲኤልኤልመጨረሻ; መጨረሻ; ሁሉንም ነገር በትክክል ከፃፉ ፣ ከዚያ ፕሮግራሙን ከጀመሩ በኋላ የቅጹ አዶ መለወጥ አለበት ፣ “ስለ ፕሮግራሙ” ቁልፍ መታከል አለበት ፣ በላዩ ላይ ጠቅ ሲያደርጉ ቅጹ ይታያልስለ እና የመውጫ አዝራሩን ሲጫኑ ፕሮግራሙ ማረጋገጫ ይጠይቃል: "ከፕሮግራሙ ይውጡ?"ባህሪያቱን ለመጠቀም ይህ ትንሽ ምሳሌ ጠቃሚ ሆኖ እንዳገኙት ተስፋ አደርጋለሁ።
ቤተ መጻሕፍት ።

የፕሮጀክት ምንጮችን ማውረድ ይቻላል. በዚህ ጽሑፍ ውስጥ ለጥያቄዎቹ መልስ ለመስጠት እሞክራለሁ-ምንድን ነው- ተለዋዋጭ አገናኝ ቤተ-መጽሐፍት ፣ ወይም ተለዋዋጭ አገናኝ ቤተ-መጽሐፍት ፣ ይህም ተመሳሳይ ተግባራትን በ ውስጥ እንደገና እንዲጠቀሙ ያስችልዎታል
የተለያዩ ፕሮግራሞች

. በእውነቱ, በጣም ምቹ መሳሪያ ነው, በተለይም ቤተ-መጽሐፍት, አንዴ ከተፃፈ, በብዙ ፕሮግራሞች ውስጥ ጥቅም ላይ ሊውል ይችላል. በዛሬው ትምህርት እንዴት መስራት እንዳለብን እንማራለን። በዚህ ጽሑፍ ውስጥ ለጥያቄዎቹ መልስ ለመስጠት እሞክራለሁ-ምንድን ነው dll

እና በእርግጥ እነሱን ይፍጠሩ!
ደህና ፣ እንጀምር!

መጀመሪያ፣ የመጀመሪያውን የዳይናሚክ ሊንክ ቤተ-መጽሐፍት እንፍጠር! እንሂድ ወደ
እና ወዲያውኑ ወደ ምናሌው ይሂዱ ፋይል -> አዲስ -> ሌላ.
ይህ መስኮት በፊታችን ይታያል፡-
ከዝርዝሩ ውስጥ Dynamic-Link Library ምረጥ (ከ2009 በፊት ባሉት ስሪቶች
ይጠቀማል
ንጥሉ DLL Wizard ይባላል)።
በውጤቱም, እኛ እዚህ ምንም አይነት ቅፅ እንደሌለን ከኮዱ ጋር አንድ መስኮት ብቻ አለን! አሁን ደስታው ይጀምራል. በቤተ መፃህፍት ውስጥ የመጀመሪያዎቹን ሂደቶች እንፃፍ.
የቤተመፃህፍት ፕሮጀክት2;

// ምናልባት ከፕሮግራም ይልቅ ያንን አስተውለው ይሆናል።
// dll ሲፈጥሩ, ቤተ-መጽሐፍት የሚለው ቃል ጥቅም ላይ ይውላል.

// ትርጉም ቤተ-መጽሐፍት.
SysUtils፣ መገናኛዎች፣
ክፍሎች; // ትኩረት! እነዚህን ሞጁሎች መግለፅን አይርሱ
// አለበለዚያ ኮዱ አይሰራም
($R *.res)

(የዲኤልኤል ኮድ በዚህ ክፍል ውስጥ ተቀምጧል)
የመጀመሪያ ጥሪ ሂደት; stdcall; ወደ ውጭ መላክ; // Stdcall - በዚህ ኦፕሬተር, መለኪያዎች ወደ ቁልል ላይ ይገፋሉ");

// ከቀኝ ወደ ግራ፣ እና ወደ ተሰልፏል

መደበኛ እሴት
// ወደ ውጭ መላክ በመርህ ደረጃ ሊቀር ይችላል, ለማብራራት ጥቅም ላይ ይውላል
የመጀመሪያ ጥሪ ሂደት; stdcall; ወደ ውጭ መላክ; // አሰራርን ወይም ተግባርን ወደ ውጭ መላክ.");
ጀምር
// ከቀኝ ወደ ግራ፣ እና ወደ ተሰልፏል

የማሳያ መልእክት("
የእኔ የመጀመሪያ ሂደት በ dll
//በኋላ በአንዳንድ ፕሮግራሞች የሚመጣ።

ጀምር
መጨረሻ።

ለአሁን እዚህ እናቆማለን ምክንያቱም... ለ ቀላል ምሳሌይህ በጣም በቂ ይሆናል. አሁን ፕሮጀክታችንን እናስቀምጠዋለን፣ እኔ በግሌ በፕሮጄክት2.dll ስም አስቀመጥኩት እና ቤተ መፃህፍቱን ለመሰብሰብ የቁልፍ ጥምርን CTRL+F9 ተጫን። ባጠራቀሙበት አቃፊ ውስጥ dpr ፋይልጋር ፋይል dll ቅጥያይህ የእኛ አዲስ የተፈጠረ ቤተ-መጽሐፍት ነው። እኔ Project2.dll የሚባል አለኝ

አሁን ከዚህ ቤተ-መጽሐፍት የመደወል ሂደቶችን እንጀምር። በመደበኛ እቅድ መሰረት አዲስ መተግበሪያ እንፈጥራለን. ከእኛ በፊት ምንም ያልተለመደ ነገር አይደለም, ቅጽ ብቻ. አዲሱን መተግበሪያ ወደ አንዳንድ አቃፊ ያስቀምጡ። እና አዲስ የተፈጠረውን ወደ ተመሳሳይ አቃፊ ይቅዱ dll ቤተ-መጽሐፍት . እነዚያ። ቪ በዚህ ምሳሌፕሮጀክት2.dll

አሁን ከቤተ-መጽሐፍት ውስጥ ተግባራትን እንዴት እንደሚደውሉ መምረጥ አለብዎት. በአጠቃላይ ሁለት የመደወያ ዘዴዎች አሉ.

ዘዴ ቁጥር 1
ምናልባት ይህ በቤተ-መጽሐፍት ውስጥ የሚገኙትን የመጥራት ሂደቶች በጣም ቀላሉ ዘዴ ነው.
ከአንድ ቤተ-መጽሐፍት ጋር ብቻ ለመስራት ተስማሚ።

ደህና፣ እንሂድ...
በኋላ ቁልፍ ቃልትግበራ የሚከተለውን ኮድ እንጽፋለን-

የመጀመሪያ ጥሪ ሂደት; stdcall; ውጫዊ "Project2.dll";
// በፕሮጄክት2.dll ምትክ የላይብረሪ ስም ሊኖር ይችላል።

ድርብ ጥሪ ሂደት; stdcall; ውጫዊ "Project2.dll";

እዚህ ፣ ምናልባት እርስዎ አስቀድመው እንደገመቱት ፣ ለፕሮግራሙ የሂደቶቻችንን ስም እንነግራለን እና እነሱ ውስጥ ናቸው እንላለን dll ቤተ-መጽሐፍትበእኔ ሁኔታ Project2.dll

አሁን, እነዚህን ቅደም ተከተሎች ለመጥራት, ስማቸውን በኮዱ ውስጥ በማንኛውም ቦታ ማስገባት ብቻ ያስፈልገናል, አሁን እናደርጋለን. ከስታንዳርድ ትር ላይ 2 አዝራር ክፍሎችን ወደ ቅጹ ላይ ጣል ያድርጉ እና በእያንዳንዱ ላይ የ OnClick ክስተት ተቆጣጣሪ ይፍጠሩ

የመጀመሪያውን ቁልፍ ጠቅ ያድርጉ;


// ወደ ውጭ መላክ በመርህ ደረጃ ሊቀር ይችላል, ለማብራራት ጥቅም ላይ ይውላል
የመጀመሪያ ጥሪ;
// ከቀኝ ወደ ግራ፣ እና ወደ ተሰልፏል

ሁለተኛውን ቁልፍ ጠቅ ያድርጉ;


// ወደ ውጭ መላክ በመርህ ደረጃ ሊቀር ይችላል, ለማብራራት ጥቅም ላይ ይውላል
ድርብ ጥሪ; // በ dll ውስጥ ያለው የአሰራር ሂደት ስም
// ከቀኝ ወደ ግራ፣ እና ወደ ተሰልፏል

ያ ነው!

ዘዴ ቁጥር 2፡-
ከመጀመሪያው የበለጠ ውስብስብ, ግን ጥቅሞቹ አሉት, እና ከሁሉም በላይ, ለተሰኪዎች ተስማሚ ነው.
ለመጠቀም ይህ ዘዴበመጀመሪያ ደረጃ በርካታ ዓለም አቀፍ ተለዋዋጮችን እናውጃለን፡-

ቫር
LibHandle፡ HModule; // ወደ ቤተመፃህፍት ሞጁል አገናኝ
የመጀመሪያ ጥሪ: ሂደት; stdcall;
// በቤተ-መጽሐፍት ውስጥ የሚገኙት የእኛ ሂደቶች ስሞች.

ድርብ ጥሪ፡ ሂደት; stdcall;

ከዚያ ፣ ከተግባራዊ ቁልፍ ቃል በኋላ ፣ ቤተ-መጽሐፍታችንን የሚጭን ሂደት እንጽፋለን-

ሂደት LoadMyLibrary (የፋይል ስም: ሕብረቁምፊ);
// ወደ ውጭ መላክ በመርህ ደረጃ ሊቀር ይችላል, ለማብራራት ጥቅም ላይ ይውላል
LibHandle:= LoadLibrary(PWideChar(የፋይል ስም));
//ላይብረሪውን በመጫን ላይ!
// ትኩረት! PChar ከ2009 ዴልፊ በታች ለሆኑ ስሪቶች
LibHandle = 0 ከሆነ ከዚያ ይጀምሩ
መልእክት ሳጥን(0""""፣0,0);
ውጣ;
መጨረሻ;
FirstCall:= GetProcAddress(LibHandle,"የመጀመሪያ ጥሪ");
// ወደ ዕቃው ጠቋሚ ያግኙ
// 1ኛ መለኪያ ወደ ቤተመፃህፍት ሞጁል አገናኝ
//2ኛ ግቤት የነገር ስም በ dll ውስጥ

DoubleCall:= GetProcAddress(ሊብሃንድል፣ድርብ ጥሪ");
@FirstCall = ምንም ካልሆነ ከዚያ ይጀምሩ

መልእክት ሳጥን(0" ቤተ-መጽሐፍት መጫን አልተቻለም",0,0);
ውጣ;
መጨረሻ;
@DoubleCall = ምንም ካልሆነ ከዚያ ይጀምሩ
// ይህንን ተግባር በቤተ-መጽሐፍት ውስጥ መኖሩን ያረጋግጡ.
መልእክት ሳጥን(0" ቤተ-መጽሐፍት መጫን አልተቻለም",0,0);
ውጣ;
መጨረሻ; መጨረሻ;

ከዚያም በቅጹ ላይ ተቆጣጣሪ እንፈጥራለን ክስተቶችን ፍጠር, በዚህ ውስጥ, አሁን የፈጠርነውን አሰራር በመጠቀም, የእኛን እንጭናለን ቤተ መጻሕፍት

ሂደት TForm1.FormCreate (ላኪ: TObject);
// ወደ ውጭ መላክ በመርህ ደረጃ ሊቀር ይችላል, ለማብራራት ጥቅም ላይ ይውላል
LoadMyLibrary ("Project2.dll");
// ከቀኝ ወደ ግራ፣ እና ወደ ተሰልፏል

አሁን፣ በድጋሚ፣ ከቤተ-መጽሐፍታችን አስፈላጊ የሆኑትን ሂደቶች ለመጥራት፣ ስማቸውን በኮዱ ውስጥ በማንኛውም ቦታ ማስገባት ብቻ ያስፈልገናል። ይህንን ለማድረግ ከስታንዳርድ ትር ላይ 2 የአዝራር ክፍሎችን በቅጹ ላይ ይጣሉት እና በእያንዳንዱ ላይ የ OnClick ክስተት ተቆጣጣሪ ይፍጠሩ

የመጀመሪያውን ቁልፍ ጠቅ ያድርጉ;

ሂደት TForm1.Button1Click (ላኪ፡ TObject);
// ወደ ውጭ መላክ በመርህ ደረጃ ሊቀር ይችላል, ለማብራራት ጥቅም ላይ ይውላል
የመጀመሪያ ጥሪ; // በ dll ውስጥ ያለው የአሰራር ሂደት ስም
// ከቀኝ ወደ ግራ፣ እና ወደ ተሰልፏል

ሁለተኛውን ቁልፍ ጠቅ ያድርጉ;

ሂደት TForm1.Button2Click (ላኪ፡ TObject);
// ወደ ውጭ መላክ በመርህ ደረጃ ሊቀር ይችላል, ለማብራራት ጥቅም ላይ ይውላል
ድርብ ጥሪ; // በ dll ውስጥ ያለው የአሰራር ሂደት ስም
// ከቀኝ ወደ ግራ፣ እና ወደ ተሰልፏል

እና በመጨረሻ፣ እኛ የምናወርድበት የ OnDestroy ክስተት ተቆጣጣሪን በቅጹ ላይ እንፈጥራለን dll ቤተ-መጽሐፍትከማስታወስ

ሂደት TForm1.FormDestroy (ላኪ: TObject);
// ወደ ውጭ መላክ በመርህ ደረጃ ሊቀር ይችላል, ለማብራራት ጥቅም ላይ ይውላል
ፍሪላይብረሪ(ሊብ ሃንድል);
//ላይብረሪውን ከማህደረ ትውስታ ያውርዱ።
// ከቀኝ ወደ ግራ፣ እና ወደ ተሰልፏል

ያ ነው! ሁለተኛው ዘዴ በጣም አስቸጋሪ ሆኖ ተገኝቷል, ነገር ግን ጥቅሙ በቤተ-መጽሐፍት ውስጥ የተቀመጠውን ነገር ግልጽ ማድረግ ነው.

ፒ.ኤስ. ከሁሉም የጣቢያ ጎብኝዎች ቀድመው አዳዲስ የቪዲዮ ትምህርቶችን፣ ኦዲዮ ፖድካስቶችን፣ በዴልፊ ላይ ያሉ ጽሑፎችን መቀበል ይፈልጋሉ?
በውድድሮች ውስጥ ይሳተፉ እና ቀስ በቀስ ቡድናችንን ይቀላቀሉ?!
ከዚያ አሁኑኑ ለጣቢያው ነፃ የመልቲሚዲያ ጋዜጣ ይመዝገቡ
እኛ ቀድሞውኑ ከ 3500 ሰዎች በላይ ነን!