2012-12-13 4 views
3

스테퍼 모터 제어 인터페이스 용 SDK의 일부인 .NET COM-dll을 사용하려고합니다. SDK는 유형 라이브러리를 제공합니다.이 라이브러리는 '구성 요소 가져 오기> 유형 라이브러리 가져 오기'를 통해 델파이로 가져 왔습니다.가져온 형식 라이브러리를 통해 COM-dll에 액세스 할 수 없습니다.

비록 내가 COM 프로그래밍에 대한 몇 가지 기본 지식을 알고 있지만, 나는 인터페이스 작동을 위해 고심하고 있습니다. 문제는 CoClass뿐만 아니라 OLE 서버 프록시가 빈 인터페이스 (즉, 메서드없이 인터페이스)를 노출한다는 것입니다 ( _ComMotorCommands). 거기에서 실제 으로 캐스팅 IComMotorCommands 인터페이스가 지원되지 않음 오류가 발생합니다.

// *********************************************************************// 
// Interface: IComMotorCommands 
// Flags:  (4416) Dual OleAutomation Dispatchable 
// GUID:  {0D4E3A3F-0C07-438B-9F6F-CC1968408CFC} 
// *********************************************************************// 
    IComMotorCommands = interface(IDispatch) 
    ['{0D4E3A3F-0C07-438B-9F6F-CC1968408CFC}'] 
    function Get_ErrorFlag: WordBool; safecall; 
    function Get_ErrorMessageString: WideString; safecall;  
    function Get_ErrorNumber: Integer; safecall; 
    ... 
    end; 

... 

// *********************************************************************// 
// Interface: _ComMotorCommands 
// Flags:  (4432) Hidden Dual OleAutomation Dispatchable 
// GUID:  {5AB3EB9E-E847-3133-95DC-4DDC7870C02A} 
// *********************************************************************// 
    _ComMotorCommands = interface(IDispatch) 
    ['{5AB3EB9E-E847-3133-95DC-4DDC7870C02A}'] 
    end; 

... 

    CoComMotorCommands = class 
    class function Create: _ComMotorCommands; 
    class function CreateRemote(const MachineName: string): _ComMotorCommands; 
    end; 

은 또한 예외가 발생하지 않는 자체

CreateComObject(CLASS_ComMotorCommands) as IComMotorCommandsDisp 

를 통해 수동으로 인터페이스를 만들기 위해 노력했다. 포트 및 전송 속도와 같은 일부 연결 속성 설정도 작동하는 것 같습니다. 하지만 모터 상태를 쿼리하자 마자

'BadImageFormatException : 잘못된 형식의 프로그램을로드하려고했습니다. (HRESULT에서 예외 : 0x8007000B) ',

마음을, 내 응용 프로그램에서 예외로 하지하지만 인터페이스 자체 ( Get_ErrorMessageString)의 오류보고 메커니즘을 통해.

이 오류는 일반적으로 x86과 x64 코드 간의 비트 충돌을 나타냅니다. 하지만 내 플랫폼 타겟은 SDK와 마찬가지로 x86입니다. Delphi XE3을 Windows 7 x64에서 실행하고 있지만 32 비트 시스템에서도 같은 오류가 나타났습니다. 나에게 아무런 의미가 없습니다.

SDK는 또한 VB, C++ 및 C#에 대한 몇 가지 Visual Studio 예제를 제공합니다. 그러나 그들 모두는 인터페이스를 호출하는 비주얼 스튜디오 방식을 사용하며 나에게 도움이되지 않습니다. TLB를 직접 참조하면 'ComMotorCommands'유형의 변수를 선언하고 모든 인터페이스 메소드에 자유롭게 액세스 할 수 있습니다.

전자 메일을 통해 전체 파일을 제공합니다.

나는 여기에 내 머리를 쓰고있어, 이것에 대한 도움은 대단히 감사하겠습니다!

+0

아마도 비트 충돌입니다. 프로필 모드의 종속 뷰어에서 프로그램을 실행하고 오류를 트리거하는 모듈로드를 확인합니다. 그런 다음 해당 모듈이 64 비트인지 확인하십시오. –

+0

감사 데이빗! 하지만 프로파일 모드에서 'Dependency Viewer'가 무엇을 의미하는지 명확하게 알지 못합니다. 제게 올바른 길을 가르쳐 주시겠습니까? –

+0

죄송합니다. 그것은 Dependency Walker라고 불립니다. 구글 그것. 적재하십시오. 프로필 메뉴 항목으로 이동하십시오. 귀하의 exe를 선택하십시오. 그리고 나서. 당신은 많은 진단을 할 것이고,로드에 실패한 모듈을 분리 해낼 수 있기를 바랍니다. –

답변

1

문제는 64 비트 모듈을로드하려는 시도 일 가능성이 큽니다. Dependency Walker를 프로파일 모드로 디버깅하십시오.

+0

다 도와 줘서 고마워. rs485_com.dll의 32 비트 버전을 추적 할 수있었습니다. 이제 인터페이스가 아름답게 작동합니다! –

+0

당신은 환영받을 만하 며 기쁘게 생각합니다. –

관련 문제