Bir dll'den bir işlevi içe aktarma sorununu anlamaya yardımcı olun - sayfa 2

 

h-file gibi bir şey yazdım


 extern __declspec ( dllexport ) int __stdcall GetIntValue ( int ) ;

o zaman cpp'de sadece


int __stdcall GetIntValue(int)
 
Belki extern anahtar sözcüğü yardımcı olabilir.
 
alsu >> :

...


ve genellikle dizelerle uğraşmamayı tercih ediyor ... neden dll'de bunlara ihtiyaç duyuluyor ??? güzellik ya da ne için?

ayrıca, borland, gerekirse char* kullanılmasını veya metatrader bir şekilde char[] kullanılmasını önerir.

 

bence inşaatçıda böyle bir şey beyan etmek doğru (tam hatırlamıyorum)

extern "C" __declspec(dllexport) int __stdcall GetIntValue();

 
GarF1eld >> :

bence inşaatçıda böyle bir şey beyan etmek doğru (tam hatırlamıyorum)

extern "C" __declspec(dllexport) int __stdcall GetIntValue();

içinde! kesinlikle!

 

İpuçları için çok teşekkürler! Bu örnek, extern "C" int __declspec(dllexport) __stdcall GetIntValue() bildirdikten sonra başarılı oldu.

Double ve string fonksiyonlarını denedim, işe yaradı. Sizden aldığım bilgileri pratik bir görev için uygulamaya karar verdim. Ama ne yazık ki... işe yaramadı, ne yazık ki.

Mümkünse, yardım edin, lütfen bir kez daha.

Builder projesinde DLL oluşturmak için bu tür dosyalar vardır: UHsvd.h, Usvd.cpp ve diğerleri.

UHsvd.h dosyasında daha sonra dışa aktarılması gereken bir işlev vardır:

bool rmatrixsvd(ap::real_2d_array bir,
intm,
int,
int gereksiz,
int gerekli,
int ek bellek,
ap::real_1d_array&w,
ap::real_2d_array&u,
ap::real_2d_array&vt);

Usvd.cpp dosyası, daha sonra dışa aktarılması gereken aynı işlevi içerir:

bool rmatrixsvd(ap::real_2d_array bir,
intm,
int,
int gereksiz,
int gerekli,
int ek bellek,
ap::real_1d_array&w,
ap::real_2d_array&u,
ap::real_2d_array&vt)

{

........

}

Bu sürümde DLL Builder'da oluşturmaya başlıyorum, sonra her şey "inşa ediliyor", her şey çıkıyor, hata yok.

UHsvd.h, Usvd.cpp gibi değişiklikler yapmaya başlarsam

extern "C" bool __declspec(dllexport) __stdcall rmatrixsvd(ap::real_2d_array a,

.....), ardından 2'den 19'a kadar olan hatalar farklı seçeneklerle görünür, yani. Bu beyanı ya başlık dosyasında ya da cpp'de yaptım ... ancak anladığım kadarıyla başlık dosyasında olması gerekiyor (o zaman sadece 2 hata var):

[BCC32 Hatası] Usvd.cpp(128): E2356 '__stdcall rmatrixsvd(ap::real_2d_array,int,int,int,int,int,ap::real_1d_array &,ap::real_2d_array &,ap: yeniden bildiriminde tür uyumsuzluğu :real_2d_array &)'
[BCC32 Hatası] UHsvd.h(111): E2344 '__stdcall rmatrixsvd(ap::real_2d_array,int,int,int,int,int,ap::real_1d_array &,ap::real_2d_array &,ap::real_2d_array) için önceki bildirim &)'

Anladığım kadarıyla, bir tür tutarsızlık ... Ama bir şeyin sonuna kadar elde edemiyorum ... :-(

Yardımınız ve desteğiniz için gerçekten minnettarım...

 

boysn писал(а) >> {...}

Mümkünse, yardım edin, lütfen bir kez daha.

Builder projesinde DLL oluşturmak için bu tür dosyalar vardır: UHsvd.h, Usvd.cpp ve diğerleri.

UHsvd.h dosyasında daha sonra dışa aktarılması gereken bir işlev vardır:

bool rmatrixsvd(ap::real_2d_array bir,
intm,
int,
int gereksiz,
int gerekli,
int ek bellek,
ap::real_1d_array&w,
ap::real_2d_array&u,
ap::real_2d_array&vt); {...}

Doğru anladıysam ap::real_1d_array bir sınıftır. Ve ap::real_1d_array & bir sınıf nesnesine referanstır.

Ama canım, Dll'ye parametre olarak yalnızca double myData[] iletebilirsin

hangi işlevlerde double * gibi görünecek.

 
jartmailru писал(а) >>

Doğru anladıysam ap::real_1d_array bir sınıftır. Ve ap::real_1d_array & bir sınıf nesnesine referanstır.

Ama canım, Dll'ye parametre olarak yalnızca double myData[] iletebilirsin

hangi işlevlerde double * gibi görünecek.

Sana tamamen katılıyorum. İthalat sırasında MQL'de beyan edeceğim bir çift olarak. Ancak şu anda C++ Builder 2009'da DLL dosyasının kendisini oluşturamıyorum. Oluşturma sırasında hatalar oluşuyor. eğer reklamı kullanmazsam

extern "C" bool __declspec(dllexport) __stdcall rmatrixsvd(ap::real_2d_array a, ...., ....), daha sonra Builder'da kitaplık derlemesi sorunsuz başarılı olur. Şimdi, Builder projesinin kendisinde bir işlev dışa aktarımını nasıl düzgün bir şekilde bildireceğimi bilmiyorum :-(, böylece ortaya çıkıyor

rmatrixsvd işlevini dışa aktarma yeteneği ile çalışan DLL

 
boysn >> :

Sana tamamen katılıyorum. İthalat sırasında MQL'de beyan edeceğim bir çift olarak. Ancak şu anda C++ Builder 2009'da DLL dosyasının kendisini oluşturamıyorum. Oluşturma sırasında hatalar oluşuyor. eğer reklamı kullanmazsam

extern "C" bool __declspec(dllexport) __stdcall rmatrixsvd(ap::real_2d_array a, ...., ....), daha sonra kitaplığın Builder'da derlenmesi sorunsuz başarılı olur. Şimdi, Builder projesinin kendisinde bir işlev dışa aktarımını nasıl düzgün bir şekilde bildireceğimi bilmiyorum :-(, böylece ortaya çıkıyor

rmatrixsvd işlevini dışa aktarma yeteneği ile çalışan DLL

Brrr. Her nasılsa garip bir şekilde benimle aynı fikirdesin.

.

Aslında "adaptör" veya "köprü" yazmakla ilgili.

Dışa aktarılan işlevin parametreleri anlamında "bağdaştırıcı"

metatrader'ın gönderebileceği parametrelerle uyumlu hale getirilmelidir,

onlar. çağrıyı gerektiği yere aktaracak ek bir işleve ihtiyaç vardır.

Ve "Köprü" - bakış açısından, işlevin gerekli olmadığı,

beyan ettiğiniz, işi kendisi yaptı.

Ve tam tersi - işi yapan işlevi çağırmanız gerekmez.

.

Onlar. arayüzü ve uygulamayı ayırmanız gerekir, yani. uygulama sınıflar üzerine inşa edilebilir

ve Dll dışında hiç kimsenin bilemeyeceği işlevler.

.

Ama bir örnek verelim.

.

Bunun gibi bir şey beyan etmelisiniz:

extern "C" bool __declspec(dllexport) __stdcall RMatrixSVD_DLL_ADAPTER(çift * giriş1, çift * giriş2, çift * çıkış)

// tabii ki burada satır ve sütun sayısını da geçiyorsunuz

{

// giriş parametrelerini ap::real_2d_array'e çevir

ap::real_2d_array a1 = convertPDoubleToReal2DArray(in1);

ap::real_2d_array a2 = ...;

.

// hesaplamak

ap::real_2d_array a3;

matrissvd(a1, a2, a3);

.

// a3'ün sonucunu dışarı çevir

convertReal2DArrayToPDoble(a3, çıkış);

.

dönüş;
}

.

Bu durumda - elbette - rmatrixsvd işlevi

ne extern "C", ne __stdcall, ne __declspec, vb. bildirilmez.

Çünkü dahili, gizli uygulamaya dahil edilmiştir.

 

pardon tam anlayamadım...

Http://alglib.sources.ru/ sitesinden C++'da ihtiyacım olan uygulamayı (kodu) indirdim. Sakıncası yoksa, lütfen ekteki 100 Kb arşive bir göz atın. Bu algoritmanın birçok yardımcı işlevi var, toplam kod satırı sayısı 3000 satır gibi bir şey ... bence, yani

sitede yazıldığı, yani çok var ve bunu MQL'ye çevirmek oldukça zor... Aynı zamanda aktarımı doğru yapabilmek için algoritmanın kendisini de anlamanız gerekiyor. Benim için şu anda zor. Bu nedenle, C++ Builder 2009'daki bu hazır kodu kullanarak bir dll yapmak ve ihtiyacım olan rmatrixsvd (...) işlevine dll'den çağırarak erişmek istiyorum. Bütün bunlarda, bir stuporum var ... nerede ve nasıl doğru bir şekilde bildireceğim ... Bu kod yardımıyla, orada tek bir satır değiştirmeden, hatasız bir DLL inşa edildi. Ama oraya extern "C" bool __declspec(dllexport) __stdcall koyar koymaz hatalar başlıyor...

Zaman ayırdığınız için teşekkür ederim.

Dosyalar:
svdy1e.cpp.zip  94 kb