2017-06-09 4 views
1

私は次のようにCygwinの下​​とdllをロードしています:ロードされたDLLのパスは何ですか?

import ctypes 
ctypes.cdll.LoadLibrary('foo.dll') 

は、どのように私は私のdllファイルの絶対パスを取得することができますか?

問題は、私は、DLLがどこにあるかの手掛かりが全くないことです。この情報を得るために私は以下に関係することができますか? UNIXで

subprocess.Popen(["which", lib], stdout=subprocess.PIPE).stdout.read().strip() 
+0

あなたはDLLをロードした後、またはそれをロードする前に、絶対パスを取得したいですか? – eryksun

+0

もちろんロード後に – nowox

+0

Cygwinが 'dladdr'をサポートしていて、ライブラリに関数名があるとすれば、それは簡単でしょう。 – eryksun

答えて

2

、ロードされた共有ライブラリのパスは、このような機能として、ライブラリ内のシンボルのアドレスとdladdrを呼び出すことによって決定することができます。

例:

import ctypes 
import ctypes.util 

libdl = ctypes.CDLL(ctypes.util.find_library('dl')) 

class Dl_info(ctypes.Structure): 
    _fields_ = (('dli_fname', ctypes.c_char_p), 
       ('dli_fbase', ctypes.c_void_p), 
       ('dli_sname', ctypes.c_char_p), 
       ('dli_saddr', ctypes.c_void_p)) 

libdl.dladdr.argtypes = (ctypes.c_void_p, ctypes.POINTER(Dl_info)) 

if __name__ == '__main__': 
    import sys 

    info = Dl_info() 
    result = libdl.dladdr(libdl.dladdr, ctypes.byref(info)) 

    if result and info.dli_fname: 
     libdl_path = info.dli_fname.decode(sys.getfilesystemencoding()) 
    else: 
     libdl_path = u'Not Found' 

    print(u'libdl path: %s' % libdl_path) 

出力:

libdl path: /lib/x86_64-linux-gnu/libdl.so.2 
+1

私の 'ctypes.CDLL'インスタンスで' dladdr'を利用できません – nowox

+0

Cygwinは(まだ) 'dladdr'をサポートしていません。そして、ctypesはCygwinの 'stdcall'をサポートしていませんか?したがって、kernel32.dllを読み込み、 'GetModuleFileNameW'を呼び出すことはできません。 64ビットプロセスの場合、64ビットWindowsには1つのABIがあるため、とにかく「CDLL」で試すことができます。しかし私はテストするためにCygwinをインストールしていません。 – eryksun

関連する問題