IT/RCP
[SWT] Win32 OLE
원창연
2020. 12. 19. 23:50
이클립스에서 OLEFrame으로 OLE객체를 내장할 수 있다.
여기서 OLE란 Object Link Editer로 MS의 OCX, ActiveX 컨트롤를 말한다.
먼저 주요클래스를 확인하여 보자
[Win32 주요 클래스]
객체를 생성하는 방법, 그리고 객체를 사용하는 방법을 알아보자
먼저 간단하게 MS워드, 익스플로러, 엑셀, 미디어플레이어 을 띄우는 방법을 알아보자
참고로 oleviewer라고 Visual Studio에서 나온것이 있는데, OLE를 사용하기 위한 API문서처럼 메소드들을 제공한다.
oleview_setup&dll.zip
0.66MB
OLE를 사용하기에 위해 주요클래스 중 몇가지를 살펴보자
OleClientSite : OLE 도큐먼트를 관리하기위함.
-편집기 생성, 토큐먼트 활성/비활성, 변경내용저장
OleControlSite : OleClientSite의 상속받아 액티브X컨트롤를 관리
-컨트롤 이벤트 제공, 변경되었음을 제공, 폰트 배경색 등 변경가능
OleAutomation : IDispatch 인터페이스 지원,메소드 사용(매개변수는 Variant형태 전달)
setProperty
invoke
invokeNoReply
OLE를 사용하여 객체 생성예제
package swt.ole;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.ole.win32.OLE;
import org.eclipse.swt.ole.win32.OleClientSite;
import org.eclipse.swt.ole.win32.OleFrame;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class OLE_Test {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
shell.setText("SWT Ole Test");
OleClientSite clientSite;
//OleControlSite oleControlSite;
OleFrame frame = new OleFrame(shell, SWT.NONE);
clientSite = new OleClientSite(frame, SWT.NONE,"Word.Document");
clientSite.doVerb(OLE.OLEIVERB_INPLACEACTIVATE);
//각 OLE객체를 생성하는 방법1~4
/*
//1.1 MS Word 띄우기:OLE객체 -ProgramID
clientSite = new OleClientSite(frame, SWT.NONE,"Word.Document");
*/
/*
//1.2 MS Word 띄우기-MS워드파일로 띄우기
clientSite = new OleClientSite(frame, SWT.NONE,new File("d:\\test.doc"));
*/
/*
//2.MS Excel 띄우기-ProgramID
clientSite = new OleClientSite(frame, SWT.NONE,"Excel.Sheet");
*/
/*
//3.익스플로러 띄우기-ProgramID
clientSite = new OleClientSite(frame, SWT.NONE,"Shell.Explorer");
*/
//4.미디어 플레이어 띄우기
//clientSite = new OleClientSite(frame, SWT.NONE,"WMPlayer.OCX");
System.out.println("clientSite : " + clientSite.getProgramID());
shell.setSize(640, 480);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
//oleAuto.dispose();
display.dispose();
}
}
여기서 주석으로 각각 막아 놓은것은 주요 OLE객체에 임. 1.2에서 파일을 통하여 OLE객체를 생성할 수도 있다.
파일을 통해 OLE객체를 생성한경우 객체에 ProgID를 추가적으로 알수 있다.
clientSite.getProgramID()
그럼 OLE객체의 메소드, Property등을 oleview.exe외 자바에서 추출하는 예제를 확인해보자
OleControlSite를 통하여 메소드들을 알수 있다.(너무 많아 자세히 보기 어렵긴하네요)
package swt.ole;
import java.io.File;
import org.eclipse.swt.SWT;
import org.eclipse.swt.internal.ole.win32.TYPEATTR;
import org.eclipse.swt.ole.win32.OLE;
import org.eclipse.swt.ole.win32.OleAutomation;
import org.eclipse.swt.ole.win32.OleClientSite;
import org.eclipse.swt.ole.win32.OleControlSite;
import org.eclipse.swt.ole.win32.OleFrame;
import org.eclipse.swt.ole.win32.OleFunctionDescription;
import org.eclipse.swt.ole.win32.OlePropertyDescription;
import org.eclipse.swt.widgets.Shell;
public class getOLEMethod {
public static void main(String[] args) {
/*
* if (args.length == 0) { System.out.println("Usage: java Main "); return; }
*/
Shell shell = new Shell();
OleFrame frame = new OleFrame(shell, SWT.NONE);
OleClientSite oleControlSite = new OleClientSite(frame, SWT.NONE, new File("d:\\test.doc"));
String progID = oleControlSite.getProgramID();
// 컨트롤은 프로그램 id를 통하여만 가져올수 있다.
OleControlSite site = new OleControlSite(frame, SWT.NONE, progID);
OleAutomation auto = new OleAutomation(site); // 각 메소드의 사용
TYPEATTR typeattr = auto.getTypeInfoAttributes();
if (typeattr != null) {
// function기술시작
if (typeattr.cFuncs > 0) {
System.out.println("Functions for " + progID + ":");
}
for (int i = 0; i < typeattr.cFuncs; i++) {
OleFunctionDescription data = auto.getFunctionDescription(i);
String argList = "";
int firstOptionalArgIndex = data.args.length - data.optionalArgCount;
for (int j = 0; j < data.args.length; j++) {
argList += "[";
//옵션 항목기술
if (j >= firstOptionalArgIndex) {
argList += "optional, ";
}
//function항목명, type기술
argList += getDirection(data.args[j].flags) + "] " + getTypeName(data.args[j].type) + " "
+ data.args[j].name;
//다음항목 , 표시
if (j < data.args.length - 1) {
argList += ", ";
}
}
System.out.println(getInvokeKind(data.invokeKind) + " (id = " + data.id + ") : " + "Signature : "
+ getTypeName(data.returnType) + " " + data.name + "(" + argList + ")" + " Description : "
+ data.documentation + "Help File : " + data.helpFile + "");
}
//속성값 기술 시작
if (typeattr.cVars > 0) {
System.out.println(" ");
System.out.println(" Variables for " + progID + " : ");
}
//속성값 기술목록출력
for (int i = 0; i < typeattr.cVars; i++) {
OlePropertyDescription data = auto.getPropertyDescription(i);
System.out.println("PROPERTY (id = " + data.id + ") :" + "Name : " + data.name + "Type : "
+ getTypeName(data.type) + "");
}
}
auto.dispose();
shell.dispose();
}
private static String getTypeName(int type) {
switch (type) {
case OLE.VT_BOOL:
return "boolean";
case OLE.VT_R4:
return "float";
case OLE.VT_R8:
return "double";
case OLE.VT_I4:
return "int";
case OLE.VT_DISPATCH:
return "IDispatch";
case OLE.VT_UNKNOWN:
return "IUnknown";
case OLE.VT_I2:
return "short";
case OLE.VT_BSTR:
return "String";
case OLE.VT_VARIANT:
return "Variant";
case OLE.VT_CY:
return "Currency";
case OLE.VT_DATE:
return "Date";
case OLE.VT_UI1:
return "unsigned char";
case OLE.VT_UI4:
return "unsigned int";
case OLE.VT_USERDEFINED:
return "UserDefined";
case OLE.VT_HRESULT:
return "int";
case OLE.VT_VOID:
return "void";
case OLE.VT_BYREF | OLE.VT_BOOL:
return "boolean *";
case OLE.VT_BYREF | OLE.VT_R4:
return "float *";
case OLE.VT_BYREF | OLE.VT_R8:
return "double *";
case OLE.VT_BYREF | OLE.VT_I4:
return "int *";
case OLE.VT_BYREF | OLE.VT_DISPATCH:
return "IDispatch *";
case OLE.VT_BYREF | OLE.VT_UNKNOWN:
return "IUnknown *";
case OLE.VT_BYREF | OLE.VT_I2:
return "short *";
case OLE.VT_BYREF | OLE.VT_BSTR:
return "String *";
case OLE.VT_BYREF | OLE.VT_VARIANT:
return "Variant *";
case OLE.VT_BYREF | OLE.VT_CY:
return "Currency *";
case OLE.VT_BYREF | OLE.VT_DATE:
return "Date *";
case OLE.VT_BYREF | OLE.VT_UI1:
return "unsigned char *";
case OLE.VT_BYREF | OLE.VT_UI4:
return "unsigned int *";
case OLE.VT_BYREF | OLE.VT_USERDEFINED:
return "UserDefined *";
}
return "unknown " + type;
}
private static String getDirection(int direction) {
String dirString = "";
boolean comma = false;
if ((direction & OLE.IDLFLAG_FIN) != 0) {
dirString += "in";
comma = true;
}
if ((direction & OLE.IDLFLAG_FOUT) != 0) {
if (comma)
dirString += ", ";
dirString += "out";
comma = true;
}
if ((direction & OLE.IDLFLAG_FLCID) != 0) {
if (comma)
dirString += ", ";
dirString += "lcid";
comma = true;
}
if ((direction & OLE.IDLFLAG_FRETVAL) != 0) {
if (comma)
dirString += ", ";
dirString += "retval";
}
return dirString;
}
private static String getInvokeKind(int invKind) {
switch (invKind) {
case OLE.INVOKE_FUNC:
return "METHOD";
case OLE.INVOKE_PROPERTYGET:
return "PROPERTY GET";
case OLE.INVOKE_PROPERTYPUT:
return "PROPERTY PUT";
case OLE.INVOKE_PROPERTYPUTREF:
return "PROPERTY PUT BY REF";
}
return "unknown " + invKind;
}
}
MS워드의 경우 OLEVIEW를 가지고 한번 메소드를 찾긴 했는데 찾는데 어려운듯
그럼 이걸가지고 특정파일을 열게 실행을 해보겠습니다.