This page is in Pre Alpha. That means no grammer checks, no editting and speeling mistakes galore! The explanations and the final version will come soon. Check it out at your own risk! Java calling code in COM set include=c:\msdev\include set lib=c:\msdev\lib PATH=C:\SDK-JAVA\BIN;C:\WINDOWS;C:\WINDOWS\COMMAND;C:\DOS622;C:\MSDEV\BIN; jjj.java public class jjj { jjj() { nnn.iii c = (nnn.iii) (new nnn.ccc()) ; int[] i = { 5 } ; c.abc(2, i) ; System.out.println("Result is " + i[0]); } public static void main(String argv[]) { jjj j = new jjj(); } } 1. jvc jjj.java nnn.odl [uuid(AAAAAAA0-F5EF-11cf-BC7E-00A0C913D202)] library nnn { importlib("stdole32.tlb") ; [uuid(ABABABA1-F5EF-11cf-BC7E-00A0C913D202),odl] interface iii : IUnknown { HRESULT abc([in] long a, [in, out] long *b) ; } [uuid(ABABABA2-F5EF-11cf-BC7E-00A0C913D202)] coclass ccc { [default] interface iii ; } }; 2. mktyplib nnn.odl 3. javatlb -d .\ nnn.tlb 4. jvc jjj.java 5. jview jjj.class zzz.cpp #include #include void abc1(char *p){FILE *fp=fopen("c:\\ z.txt","a+");fprintf(fp,"%s\n",p);fclose(fp);} char aa[100]; class Myiii { public : HRESULT virtual __stdcall QueryInterface(REFIID riid, void **ppv) { abc1("QueryInterface"); char ppsz[1000]; LPOLESTR s; StringFromCLSID(riid,&s); WideCharToMultiByte(CP_ACP ,0,s, -1 ,ppsz,256,NULL,NULL); abc1(ppsz); *ppv=(void *)this; return 0; } ULONG virtual __stdcall AddRef(void){abc1("Addref");return 0;} ULONG virtual __stdcall Release(void){abc1("Release"); return 0;} HRESULT virtual __stdcall abc(long p, long *q) { sprintf(aa,"abc %d..%d",p,*q); abc1(aa); *q = *q * p ; return S_OK ; } }; class ccc : public IClassFactory { public : HRESULT __stdcall CreateInstance(IUnknown *punkOuter, REFIID riid, void **ppv) { abc1("CreateInstance"); char ppsz[1000]; LPOLESTR s; StringFromCLSID(riid,&s); WideCharToMultiByte(CP_ACP ,0,s, -1 ,ppsz,256,NULL,NULL); abc1(ppsz); Myiii *cmg = new Myiii; *ppv=(void *)cmg; return S_OK ; } HRESULT __stdcall QueryInterface(REFIID iid, void **ppv){return S_OK ;} ULONG __stdcall AddRef(void){return 0;} ULONG __stdcall Release(void){return 0;} HRESULT __stdcall LockServer(BOOL bLock){return S_OK;} }; STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, VOID **ppv) { char ppsz[1000]; LPOLESTR s; StringFromCLSID(rclsid,&s); WideCharToMultiByte(CP_ACP ,0,s, -1 ,ppsz,256,NULL,NULL); abc1(ppsz); abc1("DllGetClassObject"); class ccc *pcf = new ccc() ; *ppv=(void *)pcf; return S_OK ; } zzz.def DESCRIPTION 'sonal' EXPORTS DllGetClassObject a.bat cl.exe -c zzz.cpp link.exe -dll ole32.lib zzz.obj -def:zzz.def register.cpp #define INITGUID #include static const CHAR szDigits[] = "0123456789ABCDEF"; static const BYTE GuidMap[] = { 3, 2, 1, 0, '-', 5, 4, '-', 7, 6, '-', 8, 9, '-', 10, 11, 12, 13, 14, 15 }; DEFINE_GUID(CLSID_CNatCom,0xABABABA2L,0xF5EF,0x11CF,0xBC,0x7E,0x00,0xA0,0xC9,0x13,0xD2,0x02); VOID GUID2StringA(REFGUID rguid, LPSTR lpsz) { int i; LPSTR p = lpsz; const BYTE * pBytes = (const BYTE *) &rguid; *p++ = '{'; for (i = 0; i < sizeof(GuidMap); i++) { if (GuidMap[i] == '-') { *p++ = '-'; } else { *p++ = szDigits[ (pBytes[GuidMap[i]] & 0xF0) >> 4 ]; *p++ = szDigits[ (pBytes[GuidMap[i]] & 0x0F) ]; } } *p++ = '}'; *p = '\0'; } long _stdcall zzz(HWND w,UINT x,UINT y,long z) { HKEY hKey,hKey2,hKey3;DWORD result; char achCLSID[1000],achLIBID[1000],achModulePathName[1000],achCurrentDirectory[1000]; #define GUIDSTR_MAX (1+ 8 + 1 + 4 + 1 + 4 + 1 + 4 + 1 + 12 + 1 + 1) if ( x == WM_LBUTTONDOWN) { GUID2StringA(CLSID_CNatCom,achCLSID) ; // Create HKEY_CLASSES_ROOT\progid\CLSID RegCreateKey(HKEY_CLASSES_ROOT, "ccc",&hKey); RegSetValue(hKey,0, REG_SZ, "ccc",lstrlen("ccc")); RegCreateKey(hKey,"CLSID",&hKey2); RegSetValue(hKey2, NULL, REG_SZ, achCLSID, GUIDSTR_MAX-1); RegCloseKey(hKey); RegCloseKey(hKey2); // Create HKEY_CLASSES_ROOT\CLSID\...create CLSID key RegCreateKey(HKEY_CLASSES_ROOT, "CLSID", &hKey); // create CLSID/GUID key RegCreateKey(hKey, achCLSID, &hKey2); // put in sample description value into CLSID\GUID key RegSetValue(hKey2, NULL, REG_SZ, "ccc", lstrlen("ccc")); // get our path .. // create subkey under CLSID\GUID RegCreateKey(hKey2, "InprocServer32", &hKey3); strcpy(achModulePathName,"C:\\ddays\\sj\\zzz.dll"); RegSetValue(hKey3, NULL, REG_SZ,achModulePathName,lstrlen(achModulePathName)); RegSetValueEx(hKey3,"ThreadingModel",0,REG_SZ,(BYTE*)"Both",sizeof("Both")); RegCloseKey(hKey3); // PROGID RegCreateKey(hKey2, "ccc", &hKey3); RegSetValue(hKey3,0,REG_SZ,"ccc",lstrlen("ccc")); RegCloseKey(hKey3); MessageBox(0,"Registered","Success",0); } if ( x == WM_DESTROY) PostQuitMessage(0); return DefWindowProc(w,x,y,z); } WNDCLASS a;HWND b;MSG c; int _stdcall WinMain(HINSTANCE i,HINSTANCE j,char *k,int l) { a.lpszClassName="a1";a.hInstance=i;a.lpfnWndProc=zzz; a.hbrBackground=GetStockObject(WHITE_BRUSH); RegisterClass(&a); b=CreateWindow("a1","kkk",WS_OVERLAPPEDWINDOW,0,0,0,0,0,0,i,0); ShowWindow(b,3); while ( GetMessage(&c,0,0,0)) DispatchMessage(&c); } 6. jview jjj.class