API: Nasıl Win32 kullanarak bir DLL işaret eden geçmek?

oy
2

Bir DLL işlevi 3 işaretçiler geçen çalışıyorum. Sahibim:

{

$ Kodu = 1;
$ Len = 100;
$ Str = x $ len;

$ Işlevi = yeni Win32 :: API (dlladı 'dllfunction', 'PPP', 'V');

$ Fonksiyonu-> Çağrı ($ kod, $ str, $ len);

}

DLL tanımlanır void dllfunction(int* a, char* str, int* len);DLL üçlük ile işaret tüm değişkenlerin değiştirir.

Bu çalıştırdığınızda, ancak ben segfaulting ediyorum. Için dokümantasyon Win32 :: API yerine Perl değişken referansların fiili değişken adı kullanmanız gerektiğini belirtti. Herkes Eksik söyleyebilir misiniz? Teşekkürler.

*daha fazla bilgi:

Eklediğim printf()üçlük adresini yazdırmak için DLL ve printfPerl üç değişkenin referansı yazdırmak için. Ve şu olsun

DLL: Kod = 0x10107458 Hata = 0x10046b50 str = 0x10107460

Perl: Kod = 0x101311b8 Hata = 0x101312a8 str = 0x10131230

Bir fikrin neden DLL yanlış adresleri oluyor?

****Daha fazla bilgi

çok hata ayıklama sonra, DLL işlevinden döndürürken bu oluyor öğrendim. I printf ( \ n yapılan) ilave edilmiştir; Bu DLL işlevinin çok son satırında ve bunu yapar çıktı, daha sonra program çalışma sırasında parçalama arızası olarak. Ben Win32 yılında olay tahmin :: API? Herkes bu karşılaştı mı?

Ayrıca, DLL her üç değişkenin başlangıç ​​değişkenleri erişmek mümkün duyuyorum. Yani işaretçi doğru geçirilir, ancak DLL döndürürken nedense bir segfault neden olur. Perl değişkene yeni veri kopyalamaya çalışırken Belki segfaulting oluyor?

Oluştur 09/12/2008 saat 21:06
kaynak kullanıcı
Diğer dillerde...                            


4 cevaplar

oy
3

AH!! Bunu anladım.

Sorun şuydu

  1. Ve isteğe sen '__Stdcall' bu varsayılan, alternatif '_cdecl' belirtebilirsiniz çağırma kuralını belirtebilirsiniz.

dll işlevi extern "C" __declspec (dllexport) ile ihraç yüzden belki '_cdecl' bayrağını kullanıyor olmalıdır yaradığı görüldü.

Win32 :: API ( 'DLL', 'dllfunction', 'PPP', 'V', '_ cdecl');

Eserleri!

herkese teşekkürler.

Cevap 09/12/2008 saat 23:30
kaynak kullanıcı

oy
0

Ben bir windows programcı ama görme değilim:

işaretçileri için bir değişken adı kullanmalıdır

Bana değişken isimleri değil, değişkenler kendilerini anlamına gelir. Bu çalışıyor mu?

$function->Call('code', 'str', 'len');

ya da belki

$function->Call('$code', '$str', '$len');

Btw, ben bellek adresleri aynı olmasını beklemek değildir. Win32::API, Windows anlayabilir ve ben ciddi onlar aynı fiziksel bellek alanı işgal şüpheliyim şey haline Perl veri elemanlarını dönüştürmek gerekir.

Cevap 09/12/2008 saat 23:08
kaynak kullanıcı

oy
0

Tamam, Adem'in linki takip bu sayfada . Buna göre, çağrı olmalıdır:

$function->Call(code, $str, len)

örnek kod bir LPSTR (aslında bir karakter *) parametresi olan bir işlev kullanır ve beklediğiniz gibi o değişkeni kullanır, ancak bu biraz burada:

işaretçileri için bir değişken adı (hayır Perl referanslar, sadece düz bir değişken ismi) kullanması gerekir.

Ben bu yazı listelenen kod belirtmek görünüyor gerektiğini çalışırlar.

Cevap 09/12/2008 saat 22:09
kaynak kullanıcı

oy
0

IANAPH, ama seni kullanmak yapmanız gereken düşünmek referansı , şöyle:

$function->Call(\$code, \$str, \$len)

Ben az yaklaşık eminim bir $ str - bu olabilir bir başvuru gerekmez. Segfault neredeyse kesin (hangi ilk yazmaya çalıştığında bağlı 100 ya) bellek adresine 1'e yazmaya çalışıyorum DLL geliyor.

Cevap 09/12/2008 saat 21:31
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more