"Delphi'de MQL5 için DLL yazma kılavuzu" makalesi için tartışma - sayfa 2

 
marketeer:
Hata ayıklama hakkında en azından bir paragraf eklemelisiniz. Makalede AV'nin ortaya çıkabileceği bir durumdan bahsediliyor, ancak diğer potansiyel hata kaynaklarını bir kenara bıraksak bile, hata konumunu manuel olarak (gözle veya zihinsel olarak) aramaya çalışmak çok uzun zaman alabilir ve başarılı olmayabilir.

Yorumunuz için teşekkürler. Bu bölümün en popüler hataları içerecek şekilde genişletilebileceğini düşünüyorum. Ancak, hataları "uzun ve başarısız" bir şekilde aramaktan kaçınmak için, her şeyi makalede yazıldığı gibi yapın. İçindeki örnekler uygulanabilir. Ayrıca, MetaEditor'deki hata ayıklayıcıyı kullanın, adım adım hata ayıklama ve kesme noktaları ile oldukça iyi!

Bu makalede kimseye nasıl programlanacağını öğretmek istemiyorum. Eğer birisi temel hatalar yapıyor ve sonra yüksek sesle bağırıyorsa, , belki de henüz kendi DLL 'lerini oluşturmamalı ve mat kısmını öğrenmeye başlamalıdır.

 

Merhaba HideYourRichess.

Çok hızlısın! Çok fazla şey yazmışsın! Delphiüzerine kendi makalelerinizi yazmalısınız .

Kısaca ve sırayla cevap vermeye çalışacağım:

1. Юниты SysUtils и Classes нужно было оставить в проекте.

SysUtils projenin içinde! sınıflarınınyapacak bir şeyi yok! SysUtils dışında istisna işleyicisi varsayılan olarak bağlı olan System 'de uygulanır, bu yüzden endişelenmek için bir neden göremiyorum.

2. DllEntryPoint (diğer adıyla DllMain) içinde her türlü prosedürü kullanmamalısınız.

DllEntryPoint örneği internette her köşede bulunmaktadır. Bu, DLL olayları oluşturmanın standart bir yoludur; örneğin, belleğin heap'ten ayrılması ve serbest bırakılmasını bağlayabilirsiniz. Bellekle çalışmanın bu yöntemiyle ilgili gerçek hatalarınız varsa, bunu dikkate almaya hazırım.

DllEntryPoint'te yapılamayan diğer her şey hakkında tartışmıyorum, çünkü bunu sık kullanmıyorum.

3. Bellek yöneticisi hakkında çok şey yazdınız. Ben sadece sonucunuzu vurgulayacağım:

Böylece DLL ve uygulamanın tek bir bellek yöneticisine sahip olmasını sağlayabilirsiniz ve bu MT4 bellek yöneticisi olacaktır.

Sorun şu ki, hiçbirimiz MT5'teki (MT4) bellek yöneticisinin nasıl çalıştığını bilmiyoruz . Ve bu yöneticiyi uygulayan işlevlerin adlarını bilsek bile, onu nasıl kullanacaksınız, çünkü MT5için API kapalı! Yani tek bir MT5 yöneticisi ve DLL fikri ütopyadır.

Okuyucuların kafasını karıştırmamak için, bunun yerine APIişlevlerinde uygulanan klasik bellek işleme tekniğini kullanmanızı öneririm . Bu, makalede dizelerle çalışma bölümünde açıklanmıştır.

Burada Delphi kitaplarından ve makalelerinden alıntı yapmak yerine, makalenin yazarına sadece makalede anlatılanlardan gerçekten neyin işe yaramadığıyla ilgili iddialarda bulunulacağına güveniyorum. Tercihen örneklerle.


 
avoitenko :

Yorumunuz için teşekkür ederiz. Bu bölümün en popüler hataları içerecek şekilde genişletilebileceğini düşünüyorum. Ancak, hataları "uzun ve başarısız" bir şekilde aramaktan kaçınmak için, her şeyi makalede yazıldığı gibi yapın. İçindeki örnekler uygulanabilir. Ayrıca, MetaEditor'deki hata ayıklayıcıyı kullanın, adım adım hata ayıklama ve kesme noktaları ile oldukça iyi!

Bu makalede kimseye nasıl programlanacağını öğretmek istemiyorum. Eğer birisi temel hatalar yapıyor ve sonra yüksek sesle bağırıyorsa, , belki de henüz kendi DLL 'lerini oluşturmamalı ve mat kısmını öğrenmeye başlamalıdır.

Ne yazık ki çok yanılıyorsunuz. Yalnızca programlamayı öğrenenler değil - hem temel hem de çok temel olmayan - aynı zamanda yetenekli programcılar da hata yapar.

Bunun matematikle değil, hata ayıklama araçlarıyla ilgisi vardır. İyi bilinen "80'e 20" istatistiğini hatırlayalım: zamanın %80'i hata ayıklamaya ve sadece %20'si kod yazmaya harcanır. Anladığım kadarıyla, makalenin amacı size uygulanabilir bir DLL'nin nasıl yazılacağını öğretmek, yani sadece verilen özel örnek değil, aynı zamanda varsayımsal başka bir kod. Elbette, tüm potansiyel hataları göz önünde bulundurmak imkansızdır, ancak prensipte bunları nasıl yakalayacağımız konusunda bilgiye ihtiyacımız var. Aksi takdirde, okuyucular örneği tekrarlamaktan başka bir şey yapamayacaklardır.

MetaEditor'ün de bununla bir ilgisi yok, çünkü DLL'nin hata ayıklamasından, yani iç kısımlarından bahsediyoruz.

Yazar sizsiniz - siz daha iyi bilirsiniz. Ben sadece sunumdaki bazı eksiklikler hakkında fikrimi belirttim.

 
"Çok hızlısın! Çok fazla yazmışsın! Delphiüzerine kendi makalelerini yazmalısın ."

Bunlar mt4 için dll'ler hakkındaki eski bir makaleden alıntılar, tamamlanmamış. Alıntıları buraya kopyaladım. Zor değil ve uzun da değil.

"SysUtils projenin içinde! sınıflarınınbununla hiçbir ilgisi yok! SysUtils 'in yanı sıra istisna işleyicisi varsayılan olarak bağlı olan System 'de uygulanır, bu yüzden endişelenmek için bir neden göremiyorum. "

Hangi birimlerin dahil edileceği mal sahibine bağlıdır. Ancak nedenini belirtmek gerektiğini düşünüyorum. Bu durumda, SysUtils ve Classes borland tarafından önerilmektedir. Ve bunun için nedenler var.

" DllEntryPoint ile ilgili örnek internette her köşede verilmektedir. Bu, DLL olayları oluşturmanın standart bir yoludur, örneğin,"

Borland, DllMain'i yaramaz ellerden kazara saklamadı. Delphi'de bir DLL oluşturmanın standart yolu gizli bir DllMain kullanmaktır. Bunun neden böyle olduğunu düşünün. Ve Microsoft'un kendisinin ne önerdiğini okuyun.

" Bellek tahsisini bağlayabilir ve heap'ten serbest bırakabilirsiniz. Bellekle çalışmanın bu yöntemiyle ilgili gerçek hatalarınız varsa, bunu dikkate almaya hazırım."

Bu size kalmış bir şey. Ancak benim tavsiyem DllMain'de hiçbir şey yapılmamasıdır.

"Sorun şu ki, hiçbirimiz MT5'teki (MT4) bellek yöneticisinin nasıl çalıştığını bilmiyoruz . Ve bu yöneticiyi uygulayan işlevlerin adlarını bilsek bile, onu nasıl kullanacaksınız, çünkü MT5için API kapalı! Bu yüzden tek bir MT5 yöneticisi ve DLL fikri ütopyadır."

;-) birisi için "kapalı" ve "ütopya" - ve bir başkası için "her şey çalışıyor". 4'ten bahsediyoruz. 5'e bakmadım.

 

Delphi kullanımına bir alternatif olduğunu da belirtmek gerekir.

Eğer Delphi kullanıcısı değilseniz Lazarus/FPC kullanmayı düşünmelisiniz, açık kaynak kodludur, Delphi ile neredeyse aynı özelliklere sahiptir (ve hatta biraz daha fazlasına), Delphi kaynak kodu ile büyük ölçüde uyumludur ve hatta yukarıdaki örneklerin hepsinin herhangi bir değişiklik yapmadan Lazarus'ta derlenebileceğine bahse girerim.

Eğer açık kaynağı tescilli yazılıma tercih ediyorsanız (ki zaten öyle yapmalısınız) aradığınız şey Delphi'nin ticari deneme sürümü değil Lazarus'tur.

 

Makalede böyle bir prosedür var:

//----------------------------------------------------------+
procedure DLLEntryPoint(dwReason: DWord); // olay işleyicisi
//----------------------------------------------------------+
begin
    case dwReason of

      DLL_PROCESS_ATTACH: // DLL sürece eklenmiştir;
          // bellek tahsisi
          Buffer:=AllocMem(BUFFER_SIZE);

      DLL_PROCESS_DETACH: // DLL'nin süreçle bağlantısı kesilir;
          // bellek boşaltma
          FreeMem(Buffer);

    end;
end;

Derleyici bana bildirilmemiş BUFFER_SIZE değişkeninin ne olduğunu soruyor.

Lütfen bana gerçekten ne olması gerektiğini ve nerede bildirilmesi gerektiğini ve hangi tamponla ilgili olduğunu söyleyebilir misiniz?

 
lucka88:

Derleyici bana bildirilmemiş BUFFER_SIZE değişkeninin ne olduğunu soruyor.

Lütfen bana orada ne olması gerektiğini ve nerede bildirilmesi gerektiğini ve hangi tampondan bahsettiğimizi söyleyebilir misiniz?

dll_mql5.dpr proje dosyasında aşağıdaki bildirim bulunmaktadır

const BUFFER_SIZE = 255;

Bir kod satırı ile

Buffer:=AllocMem(BUFFER_SIZE);

Dizeyi saklamak için bellek heap'te ayrılır.

Ve Buffer işaretçisinin kendisi, dizelerle çalışmayı gösteren GetStringBuffer işlevinde kullanılır.

 

DLL yardımı

Birisi bana rehberlik edebilir mi ... MT4 DLL dosyasını MT5'te kullanabilir miyiz ve evet ise ... MT5'te nereye yüklersiniz ve bilmem gereken başka bir şey.

Ayrıca DLL dosyasını hangi klasörde saklayacağız?

Artık DLL koduna sahip değilim, bu yüzden gerçekten yeniden yazamıyorum.

herhangi bir öneri ve yardım takdir edilecektir.

 

MT5'te Uzman Danışmanı bağlarken "dll 64 bit sürüm değil" hatasını alıyorum.

32bit dll kullanmanın herhangi bir yolu var mı?

Değilse, Delphi XE'de 64bit dll'i nasıl derleyeceğimi söyleyebilecek biri var mı?

 
meneo:

Delphi XE'de 64it dll nasıl derlenir?

64 bit desteği Delphi XE2 ve Lazarus'ta ortaya çıktı.