2012-09-19 7 views
2

프로그램을 개발했으며이 프로그램을 다른 회사에서 제조 한 제어 가능한 광원으로 작동 시키려고합니다. 회사에 이메일을 보내고 외부 라이브러리를 DLL로 보내 주기로 동의했습니다.Qt 및 외부 DLL에 연결

나는 Qt는 4.8.1를 사용하여 내 모든 소프트웨어를 개발하고이를 MSVC2008 사용하여 컴파일되었습니다.

제어 가능한 조명 DLL은 Visual Studio 2008에서 컴파일되었으며 은 C++ 또는 C# (제조업체가 확실하지 않음)으로 작성되었습니다. 의 인스턴스를 인스턴스화

  • 클래스
  • 의 상단에 using LightName; 추가

    1. 내 프로젝트에 참조로 DLL을 추가 : 내가 부여 된 모든 DLL을 내가해야한다는 말을하는 텍스트 파일입니다 다음과 같은 객체 : LightName *ln = new LightName();
    2. 새로 생성 된 LightName 인스턴스로 turnOn() 함수를 호출합니다.

    첫째, 외부 라이브러리에서 개체의 인스턴스를 인스턴스화하는 것이 특히 어렵다는 것을 알게되었습니다. 특히 하드웨어의 단순한 경우에 그렇습니다.

    둘째, 다른 회사에서 인터페이스 파일을 제공하지 않았습니다.

    내 질문은 : 어떻게 아마도 C++ DLL에 링크와 Qt는 환경에서 인터페이스 헤더 파일을하지 않고이 라이브러리에 중첩 기능을 노출 할 수 있습니까? 거기에 외부 라이브러리에 대한 인터페이스를 만드는가?


    나는 이미 다음 QLibrary를 사용하고 시도 : 나는 주어진 된 DLL은 C DLL되지 않았기 때문에

    QLibrary myLib("mylib"); 
    typedef void (*MyPrototype)(); 
    MyPrototype myFunction = (MyPrototype) myLib.resolve("mysymbol"); 
    if (myFunction) 
        myFunction(); 
    

    그러나,이 작동하지 않습니다 내가 Qt는 그래서 인터페이스가 없다 해결해야 할 기호에 대한 단서가 없습니다.


    dumpbin/EXPORTS 명령을 사용하여 내 DLL에서 내 보낸 모든 정의를 표시하려고 시도했습니다. 불행히도 이것은 아무것도 생산하지 못했습니다. 나는 내가 맹 글링 된 C++을 이런 식으로 얻어서 내 머리글을 만들기 위해 언 스크램블을 할 수 있기를 바랬다.


    그러나 나는 그것이 나에게 어떤 함수 정의를 제공하는 어떤 기호를 확인할 수없는 dependency walker (매우 유용한 도구)를 사용하려고 시도했습니다.


  • +0

    externals 라이브러리를 사용하기 위해'QLibrary'를 사용할 것을 권장하지 않습니다. 미리 라이브러리 이름을 모르는 경우에만 필요합니다 (예 : 플러그인을 지원하려는 경우). * .pro 파일을 사용하여 라이브러리를 링크해야한다고 생각합니다. – fasked

    +0

    네, 그게 다 잘되고 괜찮아요, .pro에서 라이브러리를로드하는 것도 가능합니다. 외부 라이브러리가 QLibrary 또는 .pro에서로드되었는지 여부에 관계없이 C++로 작성된 DLL에 대해 해당 라이브러리 내에서 함수를 호출하려면 어떻게해야합니까? @ fasked – stackunderflow

    +0

    그들이 헤더를 보내지 않는 이유는 무엇입니까? – cmannett85

    답변

    1

    QLibrary는 라이브러리에 C 기호로 내 보낸 함수가있는 경우에만 도움이됩니다. 그것이 C++ 인 경우 심볼 테이블을 덤프하고 그 심볼 테이블이 충분한 지 확인할 수 있습니다. 이름은 붕괴되어야합니다 : 덤프 박스 또는 유사한 것을 찾으십시오. 그러나이 작업을 수행 할 수 없으며 기호가 정의 된 방법에 따라 달라질 수 있습니다. 이 경우 헤더 (read this)를 요청해야합니다.

    1

    "개체의 인스턴스를 인스턴스화"할 것을 요구하는 것은 합법적입니다. dll 인터페이스 객체를 지향적으로 만드는 것은 단순히 디자인 결정이었습니다 (일반 extern "C"과 반대). QtCore.dll은 다른 누군가의 DLL이기도하며, 항상 개체를 인스턴스화합니다.

    그러나 DLL을 호출하기가 더 어려워 질 수도 있습니다. 기호는 "C"기호가 아닙니다 (클래스를 그런 식으로 내보낼 수 없음). QLibrary은 당신을 위해 아무 것도 할 수 없습니다. DLL에서 dumpbin /EXPORTS을 시도한 다음 tediously unmangle them을 사용하여 클래스 선언을 재구성 할 수 있습니다. 다행히도 당신을 도울 수있는 도구가 있습니다 (even online)

    그러나 이러한 DLL에 대한 헤더 파일을 제공하지 않으면 처음부터 완전히 바보입니다.

    +0

    글쎄, 정말로 C++ 코드를 풀어 놓는 웹 사이트가 도움이되기를 바랬다. 불행히도, 덤프 빈을 실행했을 때 스크램블 또는 언 스크램블 된 메소드 정의를 발견하지 못했습니다 [(덤프 빈 결과의 스크린 샷)] (http://www.freeimagehosting.net/gi3xx). 가능한 다른 제안 사항이 있습니까? 그렇지 않으면, 나는 드로잉 보드로 돌아 왔고 새로운 빛을 찾아야한다고 생각합니다. 나는 그들이 머리글 파일을 제공 할 수 없다는 것이 정말로 어리 석다는 것에 동의한다. 도와 주셔서 감사합니다. @Pavel Zdenek. – stackunderflow

    +0

    나는 dumpbin에 익숙하지 않다는 것을 인정한다. 그것은 모두가 사용하고있는 것입니다. 따라서 100 % 확실하려면 [Dependency Walker] (http://www.dependencywalker.com/)를 사용해보십시오. DLL을'depends.exe '에 놓기 만하면 오른쪽 상단의 두 번째 창에 심볼이 표시되어야합니다 (있는 경우). –

    +0

    @Pavel에게 감사의 말씀을 전합니다. 불행히도, 나는 이미 Dependancy Walker를 시험해 보았고 어떤 심볼도 해결할 수 없었습니다. 헤더 파일이 필요하기 때문에 조직에 전자 메일을 보내야 할 것 같습니다. 그렇지 않으면, 나는 불행한 다른 제어 가능한 빛으로 그냥 갈 수도 있습니다. – stackunderflow