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.
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