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
반응형
'Program Language > C#' 카테고리의 다른 글
[C#] 구조체와 클래스 (0) | 2023.02.16 |
---|---|
[C#] abstract class (0) | 2023.02.16 |
[C#] OCX에 포인터 데이터 넘기기 (0) | 2022.10.26 |
[C#] C#에서 OCX를 사용할 때 LicenseException 에러 발생 (0) | 2022.10.26 |
[C#] C++ 구조체 사용하기 (2) | 2022.09.16 |