delphi - रनटाइम संकुल के साथ बिना डेल्फी एक्स्ट और डीएलएल का निर्माण



dll runtime (1)

मेरी आखिरी परियोजना के लिए मैं अपने डेल्फी आवेदन में कई फ्रेम का उपयोग कर रहा था, इसलिए मैंने डीएलएस बनाने और डीएलएस के अंदर डाल दिया (सभी डेल्फी में बनाए गए)

मैं कई वेबसाइटों के माध्यम से चली गई हूं और उस कोड के साथ आया हूं, जो काम करता है, लेकिन उस उदाहरण के लिए मुझे रनटाइम पैकेजों के निर्माण के साथ दोनों ऐप्स और डीएलएल का संकलन करना है, जिसका अर्थ है कि मुझे बीपीएल भी वितरित करना होगा और यदि रनटाइम पैकेज त्रुटि के साथ जांच न करें तो आ रही है

यह मैं पाया कोड है

एक्सई में

procedure TForm1.Button1Click(Sender: TObject);
type
TGetTheFrame =Function( Owner: TComponent; TheParent: TWinControl ): TFrame; stdcall ;
 var
  GetTheFrame : TGetTheFrame;
begin
try
   GetTheFrame(application,TabSheet1).Free ;
except
end;
frm := GetTheFrame(application,TabSheet1) ;
dllHandle := LoadLibrary('project1.dll') ;
   if dllHandle <> 0 then
   begin
     GetTheFrame := GetProcAddress(dllHandle, 'GetTheFrame') ;
  frm := GetTheFrame(application,TabSheet1)   //call the function
    {   ShowMessage('error function not found') ;
     FreeLibrary(dllHandle) ; }
   end
   else
   begin
     ShowMessage('xxxx.dll not found / not loaded') ;
   end

डीएलएल में

Function  GetTheFrame( Owner: TComponent; TheParent: TWinControl ): TFrame; stdcall;
Begin
 Result := TFrame2.Create( Owner );

 Result.Parent := TheParent;
End;

सब कुछ है, लेकिन मुझे यह कोड रनटाइम संकुल के बिना काम करना है


बहुत बुरा। यह कोड रन-टाइम पैकेज के बिना काम नहीं करेगा। (और रन-टाइम संकुल के साथ, आपको LoadPackage बजाय LoadPackage उपयोग करना चाहिए।)

संकुल के बिना, आपके प्रोग्राम के प्रत्येक मॉड्यूल (EXE और प्रत्येक डीएलएल) की सभी मानक कक्षाओं की परिभाषा की अपनी प्रति है, जिसमें TWinControl , TWinControl , और यहां तक ​​कि TWinControl भी शामिल है। EXE से TWinControl वर्ग TWinControl लिए एक TWinControl तरह नहीं दिखता है।

चूंकि आप मॉड्यूल के बीच कक्षाएं साझा कर रहे हैं, इसलिए आपको यह सुनिश्चित करना होगा कि उन सभी वर्गों की समान परिभाषाएं हों, और रन-टाइम पैकेज हैं कि आप ऐसा कैसे करते हैं

यदि आप वास्तव में रन-टाइम पैकेज का उपयोग नहीं करेंगे, तो आपको अपने डीएलएल का इंटरफ़ेस बदलना होगा जिससे कि वह किसी भी डेल्फी ऑब्जेक्ट प्रकार को साझा न करे। TWinControl माता-पिता के बजाय, नियंत्रण की Handle प्रॉपर्टी, या किसी अन्य HWnd मान को पैरेंट विंडो के रूप में प्रदान करने के लिए पास करें। DLL कोड यह मान नहीं पाएगा कि अभिभावक के लिए डेल्फी ऑब्जेक्ट अब और है, और EXE यह मानने में सक्षम नहीं होगा कि यह प्राप्त नियंत्रण एक डेल्फी ऑब्जेक्ट है; वे खिड़की के हैंडल को हेरफेर करने और संदेश भेजने के लिए Windows API का उपयोग करने के लिए प्रतिबंधित हो जाएगा।