Program Language/C#

[C#] C++로 만들어진 OCX 사용하기

야곰야곰+책벌레 2022. 10. 26. 17:10
728x90
반응형

C++로 ActiveX를 만든 뒤, 메서드나 속성을 등록하면 아래와 같은 형식이 된다.

	//  Primary dispatch interface for CtopgraphCtrl
	[ 
		uuid(E46EECAA-BACD-41EC-A75F-0D463AABA133)	
	]
	dispinterface _Dtopgraph
	{
		properties:
			[id(1000)] DOUBLE ScaleX;
		methods:
			[id(DISPID_ABOUTBOX)] void AboutBox();
			[id(1)] void CreateGraph(BSTR name, LONGLONG color);
			[id(2)] void DeleteGraph(BSTR name);
			[id(3)] void Clear();
			[id(4)] void AddData(BSTR name, DOUBLE x, DOUBLE y, DOUBLE z);
			[id(5)] void AddArrayDataPtr(BSTR name, LONG size, LONGLONG xPtr, LONGLONG yPtr, LONGLONG zPtr);
			
	};

이것은 프로젝트명.idl 파일에 저장되어 있다. 위저드로 추가한 메서드가 이렇게 자동 생성된다.

C#에서 사용하려면 이와 동일한 형태의 구조체를 만들어야 한다.

        [ComVisible(true), ComImport, Guid("E46EECAA-BACD-41EC-A75F-0D463AABA133"),
        InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
        public interface _GraphMarshal
        {
            //properties:
            [DispId(1000)]
            void SetScaleX(double scale);
            [DispId(1000)]
            double GetScaleX();

            //methods:
            [DispId(1)]
            void CreateGraph([MarshalAs(UnmanagedType.LPWStr)] string name, long color);
            [DispId(2)]
            void DeleteGraph([MarshalAs(UnmanagedType.LPWStr)] string name);
            [DispId(3)]
            void Clear();
            [DispId(4)]
            void AddData([MarshalAs(UnmanagedType.LPWStr)] string name, double x, double y, double z);
            [DispId(5)]
            void AddArrayData([MarshalAs(UnmanagedType.LPWStr)] string name, int length, long x, long y, long z);
        }

guid는 ocx를 생성할 때 만들어진 id를 사용하면 된다. dispatch 형식으로 인터페이스 할 것이고 인터페이스는 마샬링 한다.

DispId 번호를 맞춰줘야 한다. C#의 long은 C++의 long long과 같이 때문에 이점을 주의한다. string을 역시 마샬링이 필요하다.

이렇게 선언하고 나면 이렇게 사용할 수 있다.

_GraphMarshal ocx = graphView.GetOcx() as _GraphMarshal;
Color SlateBlue = Color.FromName("SlateBlue");
ocx.CreateGraph("sine", SlateBlue.ToArgb());

이벤트마다 저 ocx를 선언해야 하지만 (멤버로 선언해보진 않았다. 될 것 같기도 하지만..) 잘 동작한다.

 

 

728x90
반응형