2014-12-05 2 views
0

죄송합니다. 영어가 유감 스럽습니다. 그럼. Dev C++에서 간단한 동적 링크 라이브러리를 작성합니다. 그것의 작업 nice.Today 내가 내 파이썬 프로젝트에서 라이브러리입니다 가져옵니다. 동적 링크 라이브러리 파일 경로 : lib/my_dll.dll #Dialog 상자Python CDLL이 라이브러리를로드 할 수 없습니다.

DLL_PATH = "lib/my_dll.dll" 

main.py (config.py) config.py는

def my_func(): 
    dll = CDLL(DLL_PATH) 
    return dll.func1() 

그래서 내가 파이썬 인터프리터를 열고이 쓰기 가져옵니다.

from main import * 
a = my_func() #Its work nice so a == "c:\\Windows\\a.txt" 

는하지만 난이 기능 파이썬은

OSErrror:[WinError 126] The specified module could not be found 

가 읽어 주셔서 감사 다음 오류를 생성 재사용!

+0

DLL의 전체 경로를 제공하십시오. 또한 null로 끝나는 문자열을 반환하는 함수는 기껏해야 모호한 것처럼 보입니다. 또한이 코드가 문자열을 반환하는 방법을 알지 못합니다. 다시 입력은 어디에도 지정하지 않았습니다. DLL은 한 번만로드해야합니다. 왜 그것을 반복해서로드하고 싶습니까? –

+0

답장을 보내 주셔서 감사합니다. 이것은 DLL 호출 Windows API 파일 선택 대화 상자입니다. 문제가되지 않습니다. 기능이 잘 작동합니다. 내 기본 프로젝트 디렉토리 c : \ Project. C : \ Project 디렉토리에는 main.py, config.py, lib 디렉토리가 있습니다 ... lib 디렉토리에는 my_dll.dll이 있습니다. 그래서 my_dll.dll을 호출하고 c_char_p (선택된 경로)를 반환합니다. a = my_func()는 경로를 반환합니다. 그러나이 함수를 다시 호출합니다. 예제 a = my_func() 오류 발생 –

+0

'dll.func1.restype = c_char_p'를 설정해야합니다. 정수 결과를'c_char_p (result)'로 변환하려고 시도하지 마십시오. 이는 64 비트 포인터를 자릅니다. – eryksun

답변

1

주석에서 DLL 함수가 파일 선택 대화 상자를 표시하는 API 함수를 호출한다고 설명합니다. 파일 선택 대화 상자는 사용하지 말라고하지 않는 한 작업 디렉토리를 변경할 수 있습니다. DLL에 대한 전체 경로를 지정하지 못했기 때문에 매번 DLL 검색이 수행됩니다. DLL이 발견되기 위해 작업 디렉토리가 필요하기 때문에 처음 성공하게됩니다. 이후에 작업 디렉토리가 변경되어 DLL 검색이 실패합니다.

조언 : DLL을로드 할 때

  1. 항상 그냥 파일 이름 또는 전체 절대 경로 중 하나를 사용하십시오. 귀하의 경우에는 후자를 사용해야 할 것으로 생각됩니다.
  2. 함수를 호출 할 때마다 DLL을로드합니다. 한 번만로드하면 충분합니다. 반복해서로드하여 시간을 낭비하지 마십시오.
  3. 파이썬에서 직접 파일 대화 상자를 보여주기 쉽고 그 목적으로 DLL을 만들지 않아도됩니다.
  4. ctypes 함수 가져 오기에서 restype을 지정하지 않으므로 해당 함수에서 텍스트를 가져 오는 방법을 알 수 없습니다. 게다가, 당신이 함수를 호출 할 때마다 메모리 누수를 피할 수있는 방법을 모르겠습니다. 텍스트가 정적 배열에없는 경우.
+0

Mr. Hefferman. 감사합니다. 현재 디렉토리에 main.py와 config.py가있는 dll 파일을 복사합니다. cdll.my_dll.my_func의 CDLL 메소드를 변경하십시오. –

관련 문제