스테퍼 모터 제어 인터페이스 용 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'유형의 변수를 선언하고 모든 인터페이스 메소드에 자유롭게 액세스 할 수 있습니다.
전자 메일을 통해 전체 파일을 제공합니다.
나는 여기에 내 머리를 쓰고있어, 이것에 대한 도움은 대단히 감사하겠습니다!
아마도 비트 충돌입니다. 프로필 모드의 종속 뷰어에서 프로그램을 실행하고 오류를 트리거하는 모듈로드를 확인합니다. 그런 다음 해당 모듈이 64 비트인지 확인하십시오. –
감사 데이빗! 하지만 프로파일 모드에서 'Dependency Viewer'가 무엇을 의미하는지 명확하게 알지 못합니다. 제게 올바른 길을 가르쳐 주시겠습니까? –
죄송합니다. 그것은 Dependency Walker라고 불립니다. 구글 그것. 적재하십시오. 프로필 메뉴 항목으로 이동하십시오. 귀하의 exe를 선택하십시오. 그리고 나서. 당신은 많은 진단을 할 것이고,로드에 실패한 모듈을 분리 해낼 수 있기를 바랍니다. –