2012-02-08 30 views
6

Bir dosya tanıtıcısını, ktiplerden, yazımların fd üzerinde gerçekleştirildiği bir C işlevine iletmeye çalışıyorum. Linux üzerinde çalışır. Pencerelerde öyle değil ve neden (ı pencerelerde bir geliştirici olarak hiçbir deneyime sahip)Bir dosya tanıtıcısını Windows'taki ktipler aracılığıyla bir C kütüphanesi işlevine geçirme

//C func signature: 
void fun(struct bah *opaque, int fd) 

piton gelen (ayrıntılar ommited) Anlamıyorum:

mylib.fun.argtypes = [POINTER(bah), c_int] 
fh = open(filename,'wb') 
#doesn't work on windows, works on linux/unix 
mylib.fun(some_ctypes_struct, fh.fileno()) 
#doesn't work on windows 
mylib.fun(bah_struct, ctypes.cdll.msvcrt._open(filename,_O_FLAGS_MASK, ACCMASK) 
#doesn't work 
mylib.fun(bah_struct, os.open(...)) 

programı yazma ölür () ler başarısız bir onaylama işlemi _osfile ile (fh) & FOPEN

cL.exe: x86 16.00.40219.01 piton 2.7.2 msc v.1500 32bit

ho Ben bunu yapmalı mıyım? hayır, lib açmak için open() boşaltmak istemiyorum. Zaten açık bir dosya tanımlayıcısını güvenli bir şekilde, platformdan bağımsız olarak geçmek istiyorum. Her ihtimale karşı


ek bilgiler,: kütüphane tinycdb, ben getopt ve dll ihracat işi yapmak için kısa bir cmake spec ve birkaç kirli yamalar ile pencerelerine hızlı taşıdık. kütüphane ve exe aracı beklendiği gibi çalışır (test edilmiş). python ctypes sarmalayıcıları, minik kordlar için linux üzerinde beklendiği gibi çalışır. pencereler bana gözbebekleri veriyor. kabul etmeyecektir, fd, kendi (msvcrt) _open libcall ile açtıktan sonra geçirmeme rağmen geçerli bir tanımlayıcıdır. I() ing/close() kütüphane içinde dosyayı ing açığım ama API değiştirmek için göze alamaz eğer


tabii, her şey çalışıyor.

+1

Hem Python hem de DLL dosyanızın kullandığı aynı C kütüphanesi (msvcrt) var mı? (http://www.dependencywalker.com/ kontrol etmek için tek yoldur.) – jdigital

cevap

4

Windows, Unix gibi dosya açıklamalarını kullanmaz, bu nedenle dosya tanıtıcılarının C çalışma zamanı tarafından taklit edildiğini varsayıyorum. İki farklı C çalışma zamanı kullanıyorsanız (örneğin, EXE ve DLL'niz farklı derleyiciler tarafından veya aynı derleyici ile ancak farklı seçeneklerle derleniyorsa), her bir çalışma zamanının kendi "dosya tanıtıcı öykünmesi" olacaktır ve Bir tanıtıcıyı birinden diğerine aktarır.

+0

python 9.0 ile derlenmiş gibi görünüyor, benim dll 10.0 kullanır. Ancak, hala OS dosya tanıtıcılarını ve C çalışma zamanı dosya tanımlayıcılarını farklı canavarlar olarak sindiriyorum. Ya 9.0 ve 10.0 çalışma zamanlarını birlikte kullanıyorum, fd "emülatörüm" eşleşmesi aynı işletim sistemi dosya tanıtıcısına sahip olmamalı mı? – user237419

+0

veya her çalışma zamanının OS dosya tanıtıcılarına fds ile eşleştiren kendi "tanımlayıcı tablosu" na sahip mi? Bu durumda hata benim cd90'ın tablosunda olduğundan ve crt10'un tablosunda aradığımdan beri mantıklı olurdu. bu nasıl çalışır? teşekkürler jdigital! – user237419

+0

Sanırım sorumu zaten cevapladınız ama "hipotez" dekoratör daha fazla sorun çıkarmamı sağlıyor. – user237419

İlgili konular