2011-12-15 3 views
0

OCX 파일로 변환하려는 100 개 이상의 내 보낸 함수가있는 C++ DLL이 있습니다.기본 클래스가 아닌 ActiveX 컨트롤 (.ocx)에서 함수를 내보내려면 어떻게합니까?

BEGIN_DISPATCH_MAP(CmyCtrl, COleControl) 
    DISP_FUNCTION_ID(CmyCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE) 
END_DISPATCH_MAP() 

을 적절한 IDL 정의를 사용 : 그러나, 나는에만이 작업을 수행하여 (비주얼 스튜디오 10 ActiveX 컨트롤 마법사 CmyCtrl라고도 함) 메인 클래스에 상주 OCX에서 기능을 내보내는 방법을 알고있다.

큰 프로젝트 전체를 구조 조정하고 모든 함수 정의 (20 개 정도의 파일에 걸쳐 있음)를 클래스로 옮기는 데별로 열의가 없습니다. 컨트롤이 사용될 VB6에서 Intellisense 등을 완벽하게 지원하는 OCX에서 클래스에없는 함수를 내보낼 수 있습니까? 어떻게해야합니까? 그리고 무엇을 명심해야합니까?

+0

확실하게 DLL로 변환하고 싶습니다. (OCX가 아님) - VB6을 사용하려면 ActiveX DLL이어야합니다. –

+0

실제로 OCX 파일을 의미합니다. 이것은 실제로 COM DLL이며 다른 확장입니다. 이전에이 작업을 수행했으며 VB6에서도 훌륭하게 작동합니다. 난 그냥 내부에 대해 잘 모르기 때문에 마법사에서 생성 한 템플릿을 사용해야합니다. –

+0

DLL 파일 확장명은 규칙을 사용하여 컨트롤 (단순 클래스 만)을 제공하지 않는 COM DLL에 사용됩니다. 제어 라이브러리 인 경우에만 OCX로 이름을 지정하십시오. – Bob77

답변

1

COM을 통해 인스턴스화 할 수있는 클래스를 만드는 새로운 "ATlObject"를 추가 할 수있는 마법사가 있어야합니다. 이를 통해 다른 클래스에서 함수를 분리 할 수 ​​있습니다. 새 클래스를 추가 할 때 ATL 프로젝트가 있다고 가정하면이 마법사는 다음과 같이 나타납니다. enter image description here

새 ATL 단순 개체를 만들면 고전적인 COM 방식으로 내 보낸 함수가있는 다른 클래스가 생깁니다. 원하는 경우 dllexport를 사용하여 항상 함수를 내보낼 수 있지만이 경우 COM을 사용하여 구성 요소와 인터페이스 할 수 없습니다.

Private Declare Function MyFuncName Lib "yourocx.ocx" ([.. parameters]) As [Return type] 

을하지만 그것은 아마 당신의 경우에 갈 수있는 방법이 아니다 : 당신은 전략을 사용하여 DLL (OCX)와 함께 내 보낸 된 함수 정규 방법을 호출 할 수 있습니다.

+0

고마워, 이건 알아두면 좋은데, 내 질문은 다음과 같은 의미이다. 전역 네임 스페이스에있는 함수를 내보낼 수 있습니까? –

+0

@FelixDombek가이 기능을 그냥 감쌀 수 없었습니까? C DLL (__declspec (dllexport))에서 할 수있는 것처럼 내보낼 수 있지만 가능하면 VB6/VB.NET에서 함수를 사용하는 쉬운 방법은 아닙니다 –

+0

실제로 VB6은' declspec (dllexport)'를 사용하려면 대신 .def 파일을 사용해야합니다. 그러나 OK, 제 질문에 대한 대답은 COM이 본질적으로 클래스 기반이기 때문에 단순히 "아니오"라고 생각합니다. –