2013-10-31 1 views
3

sbtsv.idl (Windows 8 SDK에 포함되어 있음) 용 C# inproc 서버를 만들려고합니다. 거의 every instructions I find는 MIDL을 사용하여 .tlb 파일을 만들고 tlbimport을 작성하여 프록시 DLL을 작성한다고 말합니다.MIDL에서 tlb를 만들 수없는 경우 어떻게합니까?

그러나 IDL에 library 섹션 no .tlb file will be generated이없고 sbtsv.idl 섹션에 library 섹션이없는 경우 내가 MIDL을 통해 그것을 실행하려고하면 내가

#include "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include\sbtsv.idl" 

[uuid(43250D0C-BBC6-4109-BCD2-6F61F0D3B611)] 
library sbtsvClientLib 
{ 
    interface ITsSbResourceNotification; 
}; 

그러나 라이브러리 내부에서 만들고 싶었 인터페이스를 선언 내 자신의 IDL 파일을 생성하려고

나는 다음과 같은 오류를 얻을

 
Microsoft (R) 32b/64b MIDL Compiler Version 8.00.0603 
Copyright (c) Microsoft Corporation. All rights reserved. 
Processing .\sbtsvClientLib.idl 
sbtsvClientLib.idl 
Processing C:\Program Files (x86)\Windows Kits\8.1\include\um\oaidl.idl 
oaidl.idl 
Processing C:\Program Files (x86)\Windows Kits\8.1\include\um\objidl.idl 
objidl.idl 
Processing C:\Program Files (x86)\Windows Kits\8.1\include\um\unknwn.idl 
unknwn.idl 
Processing C:\Program Files (x86)\Windows Kits\8.1\include\shared\wtypes.idl 
wtypes.idl 
Processing C:\Program Files (x86)\Windows Kits\8.1\include\shared\wtypesbase.idl 
wtypesbase.idl 
Processing C:\Program Files (x86)\Windows Kits\8.1\include\shared\basetsd.h 
basetsd.h 
Processing C:\Program Files (x86)\Windows Kits\8.1\include\shared\guiddef.h 
guiddef.h 
Processing C:\Program Files (x86)\Windows Kits\8.1\include\um\SessdirPublicTypes.idl 
SessdirPublicTypes.idl 
Processing C:\Program Files (x86)\Windows Kits\8.1\include\um\oaidl.acf 
oaidl.acf 
midl\oleaut32.dll : error MIDL2020 : error generating type library : SetFuncAndParamNames failed : put_State (0x8002802C) 

나는 클래스와 인터페이스를 직접 작성해야 할 것이라고 생각하고 있지만, 이것이 제대로 작동 할 수 있도록 잘못하고 있는지 확인하고 싶다.

답변

10

COM에는 두 가지 종류가 있습니다. 90 년대 초반의 원래 종류는 C 또는 C++에서 interop 작업을 수행하고 Microsoft의 Office 그룹에서 시작되었습니다. 그리고 나중의 종류 인 COM의 서브 세트는 원래 OLE 자동화로 명명되었습니다. DevDiv 그룹의 Visual Basic 팀이 Visual Basic의 초기 버전 용 16 비트 확장 모델 인 VBX 대신 사용할 수있는 도구를 찾았을 때 개발되었습니다. 나중에 마케팅 용어로 ActiveX로 이름이 바뀌 었습니다. 안전하지 못해서 많은 평판을 얻었으며 평범한 COM으로 이름이 바뀌 었습니다.

자동화는 VB 사용법을 뛰어 넘는 엄청난 성공을 거두었습니다. Windows의 모든 언어 런타임에서 자동화가 지원됩니다. 구현하기가 쉬운 COM의 엄격한 하위 집합을 구현하여 큰 도움을 받았습니다. 그리고 형식 라이브러리를 지원하기 위해 컴파일러가 선언을 인식 할 수있는 언어 독립적 인 방법입니다.

"오래된"COM을 대체하지는 않았지만 여전히 Windows에서 많이 사용되었습니다. api 많이 "오래된"스타일입니다. 비 자동화 종류의 표준 박쥐 신호는 IDL 파일에서 "cppquote"를보고 있습니다. 또는 IDispatch 대신 IUnknown에서 파생 된 인터페이스 또는 SAFEARRAY 대신 원시 배열을 사용하는 방법. 또는 C 또는 C++ 컴파일러 만 읽을 수있는 종류 인 Windows SDK 헤더에서 오는 구조 유형.

sbtsv.idl에서 모두 볼 수 있습니다.

MIDL에는 자동화 제한에 대한 실제 지식이 없으며 IDL을 컴파일하기 만하면 oleauto32의 ICreateTypeInfo 인터페이스 메소드를 돼지 머리글로 호출합니다. 형식 라이브러리 형식이 지원하지 않으면 쉽게 반대 할 수 있습니다. 오류 메시지는 끔찍한데, 어떤 선언이 잘못되었는지는 알려주지 않습니다. 일반적으로 MIDL 또는 Windows SDK 도구의 경우 예외는 아니지만 진단은 그다지 강력하지 않습니다. DevDiv는 친숙한 도구를 만듭니다.

sbtsv.idl에서 어떤 선언이 잘못되었는지 추측하지 않습니다. 그들 모두에 대해서. 당신은 정말로 [ComImport] 신고서를 직접 작성하여 어려운 방법으로해야합니다. 고통스럽고 오류가 발생하기 쉬운 대신 C++/CLI 래퍼를 고려하십시오.

+0

C++/CLI 래퍼를 작성하는 데 대한 크래시 과정 자습서에 대한 제안 사항이 있습니까? –

+0

나는 충돌을 일으키지 않는 것을 생각할 수 없다. 전능하신 google, "C++/cli tutorial"을 사용하십시오. –

+2

불행히도 "잘 작성된 복잡하지 않은 자습서 포함"체크 박스는 아직 Google에 구현되지 않았습니다. 나는 약간을 발견했다, 나는 당신이 대략 알고 있던 멍에에있는 어떤 다이아몬드든지 다만 희망하고 있었다 : –

관련 문제