რეკომენდაციები დელფიში მომხმარებლის ინტერფეისების შესაქმნელად. ინტერფეისებთან მუშაობის მახასიათებლები Delphi Delphi ინტერფეისის აღწერაში

ჩამოტვირთეთ Viber 23.01.2022
ჩამოტვირთეთ Viber

დელფის პროგრამირების გარემოს ერთ-ერთი ყველაზე ძლიერი მხარე არის მისი ღია არქიტექტურა, რომელიც დელფის საშუალებას აძლევს დაუშვას ერთგვარი მეტაპროგრამირება, რაც საშუალებას გაძლევთ "პროგრამირების გარემოს დაპროგრამება". ამ მიდგომამ Delphi მიიყვანა აპლიკაციების განვითარების სისტემების თვისობრივად ახალ დონეზე და გაძლევთ საშუალებას ამ პროდუქტში ჩართოთ დამატებითი ინსტრუმენტები, რომლებიც მხარს უჭერენ აპლიკაციის სისტემების შექმნის თითქმის ყველა ეტაპს. შესაძლებლობების ასეთი ფართო სპექტრი იხსნება დელფიში განხორციელებული ეგრეთ წოდებული ღია ინტერფეისების კონცეფციის წყალობით, რომლებიც წარმოადგენს IDE-ს (ინტეგრირებული განვითარების გარემო) და გარე ინსტრუმენტებს შორის კავშირს.

ეს სტატია ფოკუსირებულია დელფის ღია ინტერფეისებზე და გთავაზობთ მიმოხილვას მათ მიერ მოწოდებული ფუნქციების შესახებ. დელფი განსაზღვრავს ექვს საჯარო ინტერფეისს: ინსტრუმენტთა ინტერფეისი, დიზაინის ინტერფეისი, ექსპერტის ინტერფეისი, ფაილის ინტერფეისი, რედაქტირების ინტერფეისი და ვერსიის კონტროლის ინტერფეისი. ნაკლებად სავარაუდოა, რომ ამ სტატიის ფარგლებში ჩვენ შეგვეძლო დეტალურად გაშუქება და თითოეული მათგანის შესაძლებლობების ილუსტრირება. დელფის საწყისი ტექსტები დაგეხმარებათ უფრო დეტალურად გაიგოთ განსახილველი საკითხები, რადგან დეველოპერებმა მათ მიაწოდეს დეტალური კომენტარები. კლასის დეკლარაციები, რომლებიც წარმოადგენს საჯარო ინტერფეისებს, შეიცავს შესაბამის მოდულებს ...\Delphi\Source\ToolsAPI დირექტორიაში. დიზაინის ინტერფეისი (მოდული DsgnIntf.pas) უზრუნველყოფს საშუალებებს ქონების რედაქტორებისა და კომპონენტების რედაქტორების შესაქმნელად.

თვისებები და კომპონენტების რედაქტორები ცალკე განხილვის ღირსი თემაა, ამიტომ ჩვენ მხოლოდ გვახსოვს, რომ თვისებების რედაქტორი აკონტროლებს ობიექტის ინსპექტორის ქცევას, როდესაც თქვენ ცდილობთ შეცვალოთ შესაბამისი თვისება, და კომპონენტის რედაქტორი გააქტიურებულია, როდესაც თქვენ ორჯერ დააწკაპუნეთ მაუსის მარცხენა ღილაკს ფორმაზე განთავსებული კომპონენტის სურათზე. ვერსიის კონტროლის ინტერფეისი (VCSIntf.pas მოდული) შექმნილია ვერსიის კონტროლის სისტემების შესაქმნელად. 2.0 ვერსიით დაწყებული, Delphi მხარს უჭერს Intersolv PVCS ვერსიის კონტროლის ინტეგრირებულ სისტემას, ამიტომ უმეტეს შემთხვევაში არ არის საჭირო საკუთარი სისტემის შემუშავება. ამ მიზეზით, ჩვენ ასევე გამოვტოვებთ ვერსიის კონტროლის ინტერფეისის განხილვას. ფაილის ინტერფეისი (FileIntf.pas მოდული) გაძლევთ საშუალებას ხელახლა განსაზღვროთ IDE-ის სამუშაო ფაილური სისტემა, რაც შესაძლებელს ხდის აირჩიოთ ფაილების შენახვის საკუთარი გზა (მაგალითად, მონაცემთა ბაზის სერვერზე Memo ველებში). რედაქტირების ინტერფეისი (მოდული EditIntf.pas) უზრუნველყოფს წვდომას წყაროს ტექსტის ბუფერზე, რომელიც საშუალებას გაძლევთ გაანალიზოთ და გენერიროთ კოდი, განსაზღვროთ და შეცვალოთ კურსორის პოზიცია კოდის რედაქტორის ფანჯარაში და აკონტროლოთ წყარო ტექსტის სინტაქსის ხაზგასმა.

სპეციალური კლასები უზრუნველყოფენ ინტერფეისებს ფორმაზე მოთავსებულ კომპონენტებთან (კომპონენტის ტიპის განსაზღვრა, მშობელი და შვილის კომპონენტების მითითების მიღება, თვისებებზე წვდომა, ფოკუსის გადაცემა, წაშლა და ა.შ.), თავად ფორმასთან და პროექტის რესურსის ფაილთან. რედაქტირების ინტერფეისი ასევე საშუალებას გაძლევთ ამოიცნოთ ეგრეთ წოდებული მოდულის შეტყობინებები, რომლებიც განსაზღვრავენ პასუხს მოვლენებზე, როგორიცაა მოდულის საწყისი კოდის შეცვლა, ფორმის შეცვლა, კომპონენტის სახელის შეცვლა, მოდულის შენახვა, სახელის გადარქმევა ან წაშლა, პროექტის რესურსის შეცვლა. ფაილი და ა.შ. Tool Interface (მოდული ToolIntf. pas) დეველოპერებს აძლევს საშუალებას მიიღონ ზოგადი ინფორმაცია IDE-ის მდგომარეობის შესახებ და განახორციელონ ისეთი მოქმედებები, როგორიცაა პროექტების და ცალკეული ფაილების გახსნა, შენახვა და დახურვა, მოდულის შექმნა, ინფორმაციის მიღება მიმდინარე პროექტი (მოდულების და ფორმების რაოდენობა, მათი სახელები და ა.შ.), ფაილური სისტემის რეგისტრაცია, ინდივიდუალური მოდულების ინტერფეისების ორგანიზება და ა.შ. მოდულის შეტყობინებების გარდა, Tool Interface განსაზღვრავს დანამატებს, რომლებიც აცნობებენ მოვლენებს, როგორიცაა ფაილების და პროექტების გახსნა/დახურვა, პროექტის დესკტოპის ფაილის ჩატვირთვა და შენახვა, პროექტის მოდულების დამატება/გამორიცხვა, პაკეტების ინსტალაცია/წაშლა, პროექტის შედგენა, ხოლო მოდულური ნოტიფიკატორებისგან განსხვავებით, დანამატები საშუალებას გაძლევთ გააუქმოთ ზოგიერთი მოვლენის შესრულება.

გარდა ამისა, Tool Interface უზრუნველყოფს Delphi IDE-ის მთავარ მენიუში წვდომის საშუალებას, რაც საშუალებას გაძლევთ ჩადოთ მასში დამატებითი ელემენტები. Expert Interface (მოდული ExptIntf.pas) არის საფუძველი ექსპერტების შესაქმნელად - პროგრამული მოდულები, რომლებიც ჩაშენებულია IDE-ში მისი ფუნქციონირების გასაფართოებლად. ექსპერტის მაგალითია Delphi Database Form Wizard, რომელიც ქმნის ფორმას მონაცემთა ბაზის ცხრილის შინაარსის სანახავად და შესაცვლელად. ექსპერტთა კლასის განსაზღვრის შემდეგ, ჩვენ უნდა დავრწმუნდეთ, რომ Delphi „ისწავლის“ ჩვენი ექსპერტის შესახებ. ამისათვის ის უნდა დარეგისტრირდეს RegisterLibraryExpert პროცედურის გამოძახებით, პარამეტრად ექსპერტის კლასის ინსტანციის გადაცემით. საილუსტრაციოდ, მოდით შევქმნათ მარტივი ექსპერტი esStandard სტილში, რომელიც დელფის მენიუს შესაბამისი ელემენტის არჩევისას აჩვენებს შეტყობინებას, რომ ის მუშაობს. როგორც ზემოთ მოყვანილი ცხრილიდან ხედავთ, esStandard სტილი მოითხოვს ექვსი მეთოდის გადაფარვას:

იმისათვის, რომ ექსპერტი იყოს „გააქტიურებული“, თქვენ უნდა აირჩიოთ მენიუს ელემენტი Component/Install Component... , აირჩიეთ ექსპერტის შემცველი მოდული (ჩვენს შემთხვევაში exmpl_01.pas) Browse დიალოგში, დააწკაპუნეთ OK და კომპილაციის შემდეგ. dclusr30.dpk პაკეტი Delphi-ის მთავარ მენიუში დახმარების განყოფილებაში უნდა გამოჩნდეს Simple Expert 1 ელემენტი, არჩევისას გამოჩნდება საინფორმაციო შეტყობინება "სტანდარტული ექსპერტი დაიწყო!". რატომ აყენებს Delphi ექსპერტი მენიუს პუნქტს დახმარების განყოფილებაში, საიდუმლო რჩება. თუ არ მოგწონთ ის ფაქტი, რომ მენიუს ელემენტი ჩნდება სადმე დელფში და არა იქ, სადაც გსურთ, შესაძლებელია შემდეგი ვარიანტი: შექმენით ექსპერტი დანამატის სტილში, რომელიც გამორიცხავს მენიუს ელემენტის ავტომატურ შექმნას და დაამატეთ მენიუს ელემენტი „ხელით“ Tool Interface-ის გამოყენებით. ეს საშუალებას მოგცემთ დააყენოთ ახალი ელემენტის მდებარეობა მთავარ მენიუში თვითნებურად.

მენიუს ელემენტის დასამატებლად გამოიყენება TIToolServices კლასი - Tool Interface-ის საფუძველი - და TIMainMenuIntf, TIMEenuItemIntf კლასები, რომლებიც ახორციელებენ ინტერფეისებს IDE მთავარ მენიუში და მის ელემენტებთან. TIToolServices კლასის ToolServices ინსტანცია იქმნება თავად IDE-ის მიერ, როდესაც ის ინიციალიზდება. გაითვალისწინეთ, რომ დეველოპერის პასუხისმგებლობაა, გაათავისუფლოს ინტერფეისები დელფის მთავარ მენიუში და მის ელემენტებზე. ამ გზაზე, მოდით ოდნავ გავართულოთ Expert Advisor-ის ფუნქციური დატვირთვა: როდესაც მისი მენიუს ელემენტი გააქტიურდება, ის გამოსცემს ინფორმაციას იმ პროექტის სახელწოდების შესახებ, რომელიც ამჟამად ღიაა გარემოში: როგორც პარამეტრებს, გადაეცემა მენიუს ახალი ელემენტის ტექსტი, მისი იდენტიფიკატორი, ელემენტის იდენტიფიკატორი, რომლის წინაშეც არის ჩასმული ახალი ელემენტი, კლავიშის სიმბოლური წარმოდგენა, რომელიც Ctrl კლავიშთან ერთად შეიძლება გამოყენებულ იქნას სწრაფი წვდომისთვის. ახალი ელემენტი და მოვლენის დამმუშავებელი, რომელიც შეესაბამება ახალი ელემენტის შერჩევას. ჩვენ დავამატეთ მენიუს ახალი ელემენტი View განყოფილებაში საათების პუნქტამდე.

ახლა მოდით გავეცნოთ ნოტიფიკატორებს. მოდით განვსაზღვროთ დამატებითი შეტყობინებები, რომელიც თვალყურს ადევნებს პროექტების დახურვის/გახსნის დროს და შესაბამისად არეგულირებს ველს, რომელიც ინახავს აქტიური პროექტის სახელს (მოკლედ გამოვტოვებთ წინა მაგალითთან შედარებით შეუცვლელი მეთოდების განხორციელებას): განხორციელება. შემტყობინებელი, ჩვენ განვსაზღვრეთ TAddInNotifier კლასი, რომელიც არის TIAddInNotifier-ის შთამომავალი და უგულებელყოფს FileNotification-ს. IDE გამოიძახებს ამ მეთოდს ყოველ ჯერზე, როდესაც მოხდება მოვლენა, რომელზეც დანამატის შემტყობინებელს შეუძლია უპასუხოს (თითოეული ასეთი მოვლენა აღინიშნება შესაბამისი TFileNotification ტიპის მუდმივით). Expert ველი TAddInNotifier კლასში ემსახურება ექსპერტთან გამოხმაურებას (TAddInNotifier.FileNotification მეთოდი). ექსპერტის დესტრუქტორში შემტყობინებლის რეგისტრაცია დაურეგისტრირებელია და შემტყობინებელი ნადგურდება. ახლა მოდით წარმოვიდგინოთ მოდულური ნოტიფიკატორების გამოყენება. მოდით შევქმნათ დამატებითი ექსპერტი, რომელიც გასცემს შეტყობინებებს პროექტის ფაილის შენახვის თითოეული აქტის შესახებ (მოკლედ, ჩვენთვის უკვე ცნობილი მეთოდების განხორციელება არ არის მოცემული): ამ მაგალითში, დანამატის ექსპერტი აკონტროლებს გახსნის შესაბამის მოვლენებს. /პროექტების დახურვა.

ყოველ ჯერზე, როდესაც იხსნება პროექტი, რეგისტრირებულია პროექტის ფაილის შესაბამისი მოდულის ნოტიფიკატორი. განხორციელების თვალსაზრისით, მოდულური ნოტიფიკატორები მსგავსია დანამატების შემტყობინებების: ჩვენ განვსაზღვრავთ TModuleNotifier კლასს, რომელიც არის TIModuleNotifier-ის შთამომავალი და უგულებელყოფს მის Notify და ComponentRenamed მეთოდებს. IDE იძახებს Notify მეთოდს, როდესაც ხდება ამ მოდულთან დაკავშირებული გარკვეული მოვლენები; ამ მეთოდის შიგნით განისაზღვრება რეაქცია კონკრეტულ მოვლენაზე. ComponentRenamed მეთოდი იწოდება, როდესაც იცვლება კომპონენტის სახელი, რომელიც მოდულის ფორმაშია. გთხოვთ გაითვალისწინოთ, რომ ჩვენ არ ვიყენებთ ამ მეთოდს, მაგრამ უნდა ავუაროთ მას, წინააღმდეგ შემთხვევაში, როდესაც კომპონენტის სახელი შეიცვლება, გამოიძახება საბაზისო კლასის აბსტრაქტული მეთოდი, რაც იწვევს არაპროგნოზირებად შედეგებს.

მოდულის შეტყობინებების დარეგისტრირება გარკვეულწილად უფრო რთულია, ვიდრე შემატყობინებლის დანამატის რეგისტრაცია: ჯერ ვიღებთ მოდულის ინტერფეისს (TIModuleInterface) და შემდეგ ვარეგისტრირებთ ნოტიფიკატორს მოდულის ინტერფეისის გამოყენებით. როდესაც პროექტი დახურულია, მოდულის შემტყობინებელი არ არის რეგისტრირებული (ისევ TIModuleInterface-ის გამოყენებით) და ნოტიფიკატორი განადგურებულია. დასასრულს, ჩვენ გაჩვენებთ, თუ როგორ შეგიძლიათ განსაზღვროთ კურსორის პოზიცია კოდის რედაქტორის ფანჯარაში. მოდით შევქმნათ ექსპერტი მრჩეველი, რომელიც მენიუს შესაბამისი პუნქტის არჩევისას აჩვენებს შეტყობინებას, რომელიც შეიცავს აქტიური ფაილის სახელს და მასში კურსორის პოზიციას (მოცემულია მხოლოდ იმ მეთოდების დანერგვა, რომლებიც აუცილებელია ამ მაგალითისთვის): კურსორის პოზიციის დასადგენად უნდა მივიღოთ ინტერფეისების შემდეგი თანმიმდევრობა: მოდულის ინტერფეისი (TIModuleInterface); კოდის რედაქტორის ინტერფეისი (TIEditorInterface); მოდულის ნახვის ინტერფეისი რედაქტორის ფანჯარაში (TIEditView).

თუ აქტიური ფაილი საწყისი ტექსტით (*.pas) აქტიურია მენიუს ექსპერტის პუნქტის არჩევისას, მაშინ გამოჩნდება შეტყობინება, რომელიც შეიცავს აქტიური ფაილის სახელს და მასში კურსორის მიმდინარე პოზიციას. თუ აქტიური ფაილი არ არის pas ფაილი, შეტყობინება არ გაიცემა. აქტიური ფაილის სახელის მისაღებად გამოიყენება TIToolServices კლასის GetCurrentFile მეთოდი. ამით დასრულდა ჩვენი განხილვა საჯარო ინტერფეისების გამოყენების გზების შესახებ. CD-ROM შეიცავს ყველა მოცემული მაგალითის წყაროს კოდს. CD-ROM ასევე შეიცავს უფრო რთულ და გაფართოებულ მაგალითს, რომელიც შეიცავს დამატებით ექსპერტს, რომელიც მომხმარებელს საშუალებას აძლევს მონიშნოს დელფის მოდულების საწყისი კოდი. სანიშნეების ექსპერტის ინსტალაციისა და გამოყენების სწრაფი სახელმძღვანელო მოცემულია bkmrks97.htm ფაილში. ამრიგად, ამ სტატიაში საჯარო ინტერფეისები განიხილება ზოგადი თვალსაზრისით და მოცემულია მათი გამოყენების მაგალითები. კიდევ ერთხელ, ღია ინტერფეისების წყაროს კოდების ხელმისაწვდომობის წყალობით, თქვენ შეგიძლიათ მარტივად გაიგოთ თქვენთვის საინტერესო დეტალები. ვიმედოვნებთ, რომ ღია ინტერფეისებით გათვალისწინებული შესაძლებლობების მრავალფეროვნება მოგცემთ ერთზე მეტ თამამ და სასარგებლო იდეას.

მხოლოდ შედეგებისთვის

ვადების მკაცრი დაცვა

გამჭვირვალობა

პროექტის განხორციელება

ტექნიკური მხარდაჭერა საჩუქრად

პროგრამირება, გაუმჯობესება, კონსულტაციები 1C-ზე

როგორ ვმუშაობთ

1. პრობლემას ტელეფონით განვიხილავთ. თუ თქვენ გაქვთ დისტანციური წვდომა - აჩვენეთ თქვენი კომპიუტერის ეკრანზე.

2. ჩვენ ვაფასებთ სამუშაოს რუბლებში, თუ პროექტი დიდია, თუ არა - საათების სავარაუდო რაოდენობა.

3. ჩვენ ვასრულებთ სამუშაოს.

4. თქვენ იღებთ სამუშაოს თქვენს პროგრამაში, თუ არის ხარვეზები, ვასწორებთ მათ.

5. ჩვენ გავცემთ ინვოისს, თქვენ იხდით.

სამუშაოს ღირებულება

1. ყველა სამუშაო დაყოფილია 3 კატეგორიად: კონსულტაცია, ტიპიური კონფიგურაციის განახლება, ახალი ანგარიშის შემუშავება ან დაპროგრამება, დამუშავება, ღილაკები და ა.შ.

3. 10 საათზე მეტი სამუშაოსთვის წინასწარ მზადდება ტექნიკური დავალება სამუშაოს აღწერით და ღირებულებით. მუშაობა იწყება თქვენთან TOR-ის დამტკიცების შემდეგ.

Ტექნიკური მხარდაჭერა

1. თუ აღმოაჩენთ რაიმე შეცდომებს ადრე მიღებულ ნამუშევრებში, 3 თვის განმავლობაში ვასწორებთ მათ უფასოდ.

2. მუდმივ კლიენტებს ვაფიქსირებთ ნებისმიერ ხარვეზს ჩვენს მუშაობაში ერთი წლის განმავლობაში უფასოდ.

პროგრამები თქვენი ბიზნესის მართვისთვის.

შეიძინეთ 1C: Enterprise

ჩვენ ვართ 1C-ის ოფიციალური დილერი, ჩვენთან შეგიძლიათ შეიძინოთ სხვადასხვა პროგრამული პროდუქტი და ლიცენზიები. გარდა „ყუთის“ ყიდვისა, ჩვენ დაგეხმარებით პროგრამის დაყენებაში, კონსულტაციასა და ძირითადი პარამეტრების დაყენებაში.

  • Აღრიცხვა
  • მაღაზიის ავტომატიზაცია
  • Საბითუმო
  • დახმარება ინსტალაციასთან და თავდაპირველ დაყენებასთან დაკავშირებით შედის პაკეტში!
  • კონფიგურაციის დახვეწა მომხმარებლის საჭიროებებზე, ახალი მოდულების შემუშავება სტანდარტულ კონფიგურაციაში საჭირო ფუნქციების არარსებობის შემთხვევაში.
1c ბუღალტერია 1C: ვაჭრობის მენეჯმენტი 1C: საცალო ვაჭრობა 1C: სახელფასო და ადამიანური რესურსების მართვა
3300 რუბლიდან. 6700 რუბლიდან. 3300 რუბლიდან. 7400 რუბლიდან.

სერვერის მიწოდება.

მყისიერი დაყენების სერვერი + 1C.

სერვერი არაა? არა უშავს, ჩვენ შევარჩევთ და სწრაფად დავაყენებთ სერვერს „ღრუბელში“. მცირე საფასურისთვის მიიღებთ ძალიან საიმედო გადაწყვეტას.

  • ხელმისაწვდომობა 24\7
  • არ არის საჭირო თქვენი საკუთარი სისტემის ადმინისტრატორის შენარჩუნება (დაზოგვა დაფარავს თქვენი სერვერის ღირებულებას).
  • 1C-ის სწრაფი დაყენება და ინსტალაცია სერვერზე, 3 დღეში უკვე გექნებათ სრულად მომუშავე სისტემა.
  • ნებისმიერ დროს, შეგიძლიათ გადახვიდეთ ადგილობრივ სერვერზე, თუ გამოსავალი არ შეესაბამება თქვენ.

SMS თქვენი 1C-დან

გსურთ, მომხმარებლებმა დროულად გაიგონ აქციებისა და ფასდაკლებების შესახებ? კლიენტები არ ბრუნდებიან? დააყენეთ SMS გაგზავნა პირდაპირ 1C-დან!

ჩვენი კომპანია შეძლებს სწრაფად დააყენოს SMS გაგზავნა თქვენს კლიენტებზე პირდაპირ 1C-დან. მოვლენების მაგალითები, რომლებიც შეიძლება ავტომატიზირებული იყოს:

  • მადლიერება ბონუსების შეძენისა და დარიცხვისთვის შემდეგი შეძენისთანავე.
  • პრემიების დარიცხვა ბარათზე საჩუქრად დაბადების დღის/სხვა მნიშვნელოვანი ან სადღესასწაულო დღისთვის.
  • საწყობის შეტყობინება.
  • სასაჩუქრე ვაუჩერის ვადა გასულია.
  • შეტყობინება საქონლის წინასწარი გადახდისა და დაჯავშნის შესახებ.
  • მისამართი მაღაზიის/ოფისის მიმართულებით, ტელეფონის ნომრებით.
  • და ა.შ.

1C-ში დაყენება შეიძლება გაკეთდეს ჩვენი სპეციალისტების ან ჩვენი თანამშრომლების მიერ. ტარიფების გაცნობა შეგიძლიათ SMS- ტარიფების გვერდზე.

  • SMS მიწოდების გარანტია, თანხის ამოღება ხდება მხოლოდ მიწოდებულ SMS-ზე.
  • ცალკე ბილინგი თითოეული SMS-ისთვის.
  • ბალანსის შევსება სხვადასხვა გზით.
  • იხილეთ ყველა გაგზავნილი SMS-ის ისტორია ნებისმიერ დროს.
  • გამგზავნის სახელი მიმღების ტელეფონზე ციფრული ნომრის ნაცვლად.

C++ კოდიდან Delphi კლასის გამოყენების პრობლემა მაქვს. delphi dll დემო ვერსია, რომელიც ახორციელებს ფუნქციის ექსპორტს, რომელიც აბრუნებს ობიექტს.
ჩემი Delphi Dll კოდი ასე გამოიყურება:

ბიბლიოთეკა DelphiTest; // იყენებს ნაწილს.... ტიპი IMyObject = ინტერფეისის პროცედურა DoThis(n: Integer); ფუნქცია DoThat: PWideChar; დასასრული; TMyObject = class(TInterfacedObject,IMyObject) პროცედურა DoThis(n: Integer); ფუნქცია DoThat: PChar; დასასრული; // TMyObject განხორციელება გადადით აქ ... პროცედურა TMyObject.DoThis(n: Integer); start showmessage("თქვენ უწოდებთ DoThis მეთოდს "+intToStr(n) +"პარამეტრით"); დასასრული; ფუნქცია TMyObject.DoThat: PChar; start showmessage ("თქვენ ურეკავთ DoThat ფუნქციას"); შედეგი:= Pchar ("Hello im Dothat"); დასასრული;

// DLL ფუნქციის ექსპორტი:

ფუნქცია CreateMyObject: IMyObject; stdcall;ექსპორტი; var txt: TextFile; დაიწყეთ AssignFile (txt, C:\log.log"); გადატვირთვა (txt); Writeln (txt, "გამარჯობა"); შედეგი:= TMyObject.Create; დასასრული; ექსპორტი CreateMyObject;

ჩემს C++ პროექტში მე გამოვაცხადე ინტერფეისი IMyObject ასე:

კლასი IMyObject ( საჯარო: IMyObject(); ვირტუალური ~IMyObject(); ვირტუალური void DoThis(int n) = 0; ვირტუალური char* DoThat() = 0; );

და ჩემი მთავარი ფუნქცია შემდეგია:

Typedef IMyObject* (__stdcall *CreateFn)(); int main() ( HMODULE hLib; hLib = LoadLibrary (L"DelphiTest.dll"); assert(hLib != NULL); // pass !! CreateFn pfnCreate; pfnCreate = (CreateFn)GetProcAddress((HINSTANateyOreject) "); if (pfnCreate == NULL) (DWORD erc = GetLastError(); printf("%u\n", erc); // ის იღებს შეცდომას 127) else(printf("წარმატებული ჩატვირთვა\n"); ) IMyObject* objptr = pfnCreate(); objptr->DoThis(5); FreeLibrary(hLib); int in; scanf_s ("%i", &in); დაბრუნება 0; )

ამ მაგალითში მე მივიღე გაშვების შეცდომა, როდესაც ვცდილობ ექსპორტირებულ ფუნქციაზე წვდომას. ხაზის შეცდომები:
IMyObject* objptr = pfnCreate();

შეგიძლიათ მითხრათ, რისი ბრალია ჩემი მაგალითი.
და თუ შესაძლებელია რაიმე სამუშაო მაგალითი დელფის კლასზე (DLL-ში) წვდომისთვის C++ კოდიდან.

გადაწყვეტილება

პირველი პრობლემა არის მეთოდის კონვენციის გამოძახება. დელფის ინტერფეისი იყენებს რეგისტრს, რომელიც არის დელფის სპეციფიკური დარეკვის კონვენცია. stdcall-ის გამოყენებით, მაგალითად, ინტერფეისის მეთოდებისთვის.

შემდეგი პრობლემა არის C++-ში. თქვენი C++ ინტერფეისი უნდა მომდინარეობდეს IUnknown-დან, ასევე, არ უნდა გამოაცხადოს კონსტრუქტორი ან დესტრუქტორი.

გარდა ამისა, თქვენი Delphi კოდი ახორციელებს PWideChar-ს ექსპორტს, რომელიც არ ასახავს char*-ს, ის ასახავს wchar_t*-ს.

უფრო შორს რომ გადავხედოთ, PChar-ის დაბრუნება აქ მშვენივრად მუშაობს, რადგან თქვენი განხორციელება აბრუნებს სიტყვასიტყვით. მაგრამ უფრო სერიოზულ კოდს ალბათ სურს გამოიყენოს დინამიურად გამოყოფილი სტრიქონი, რა დროსაც თქვენი დიზაინი ხარვეზებულია.

გაითვალისწინეთ, რომ თქვენ უნდა იყოთ მაღალი ადმინისტრატორი, რომ შექმნათ ფაილი სისტემის დისკის ძირში. ასე რომ, ეს არის მარცხის კიდევ ერთი პოტენციური წერტილი.

ველოდები, რომ სხვა შეცდომებიც არის, მაგრამ ეს არის ყველაფერი, რაც აქამდე ვიპოვე.

ეს სტატია ეფუძნება ფორუმებზე დასმულ კითხვებს: „როგორ დავაბრუნო სტრიქონი DLL-დან?“, „როგორ გავატარო და დავაბრუნო ჩანაწერების მასივი?“, „როგორ გადავცე ფორმა DLL-ს?“.

რომ ნახევარი სიცოცხლე არ დახარჯო ამის გარკვევაში - ამ სტატიაში ყველაფერს ვერცხლის ლანგარზე მოვიტან.

ამ სტატიის თემები, სხვადასხვა ხარისხით, უკვე არაერთხელ იქნა შეხებული ამ ბლოგში, მაგრამ ამ სტატიაში ისინი შეგროვებულია გროვაში, მოცემულია დასაბუთება. მოკლედ, ამ სტატიის ბმული შეიძლება გადაეცეს მათ, ვინც ავითარებს DLL-ს.

Მნიშვნელოვანი ჩანაწერი: სტატია უნდა წაიკითხოთ თანმიმდევრულად. კოდის მაგალითები მოცემულია მხოლოდ როგორც მაგალითები, სტატიის ყოველ საფეხურზე (პუნქტში) ემატება მაგალითების კოდი ახალი დეტალებით. მაგალითად, სტატიის დასაწყისში არ არის შეცდომის დამუშავება, მითითებულია „კლასიკური“ მეთოდები (როგორიცაა GetLastError-ის, sdtcall-ის კონვენციების გამოყენება და ა.შ.), რომლებიც სტატიის მსვლელობისას იცვლება უფრო ადეკვატურით. ეს კეთდება იმ მიზეზით, რომ "ახალი" ("არაჩვეულებრივი") დიზაინი არ აჩენს კითხვებს. წინააღმდეგ შემთხვევაში, თითოეულ მაგალითში უნდა ჩასვათ შენიშვნა: „ეს განიხილება ქვემოთ მოცემულ აბზაცში, მაგრამ ის - ამ ერთში“. ნებისმიერ შემთხვევაში, სტატიის ბოლოს არის ბმული მზა კოდის შესახებ, რომელიც დაწერილია სტატიაში ნათქვამის გათვალისწინებით. შეგიძლიათ უბრალოდ აიღოთ და გამოიყენოთ. და სტატია განმარტავს რატომ და რატომ. თუ არ გაინტერესებთ "რატომ და რატომ" - გადაახვიეთ ბოლომდე დასკვნამდე და მაგალითის გადმოსაწერად ბმული.



ჩვენ გირჩევთ წაიკითხოთ

ზედა