Re: callback problem
Vitaly Shelest <[email protected]> Tue, 3 Apr 2007 00:28:56 +0200
| Newsgroups | gmane.comp.windows.devel.jawin |
|---|---|
| Message-ID | <[email protected]> |
Hi, I wonder if you are trying to debug JAWIN. But why you ask such question? Debug the code! I only want you to have a look at JAWIN design problems. Its basic ideas should be revised. What I am developing now is not a product but only demo. I plan to issue it in half a year. I gave you the references to show how such products should be designed. Regards, Vitaly Shelest "Howard Chivers" <[email protected]> wrote in message news:LISTSERV%[email protected]... > (1) Vitaly, > > Thanks for your message. I would prefer to contribute to an open-source > project than buy a commercial alternative; I wish to share freely the > results of my work. > > (2) Anyone else > > I should have mentioned in my original post - if I run using the jawin > debug dll, then no exception is thrown; however, only 5 callbacks are > made, > however many should be available. > > regards > Howard > > > > On Sun, 1 Apr 2007 13:53:46 +0200, Vitaly Shelest > <[email protected]> > wrote: > >>Hi, >>some time ago I also tried to use Native Function call implemented in >>JAWIN >>but failed. This piece of the project have not been accomplished. They >>suggest to use explicit marshaling that is not clear for Developer. > Function >>calling conventions cdecl, fastcall are not supported (only stdcall). >>Structure marshal is headache (they do not support union, struct. >>packing, >>etc.). The same problems with call of native functions from virtual >>tables. >>I also tried to use another projects like xFunctions, JNIWrappers, etc. >>These projects support complex explicit marshaling makes my code huge >>and >>unclear. >>As a result I started to develop my own API for Native Function Call >>from >>Java. Having learnt Platform Invoke in .NET I have realized that the >>same >>can be done in SUN/IBM Java. My API implements in Java .NET Platform >>Invoke >>paradigm: >>- implicit and explicit marshaling; >>- C Structure marshaling; >>- Java array marshaling; >>- marshal by value and by reference; >>- callback functions; >>- C class functions call from Class Virtual Table, etc. >> >>See links: >>http://www.simtel.net/product.php[id]100916[SiteID]simtel.net >>http://www.programmersheaven.com/download/51865/download.aspx >> >> >> >>Regards, >>Vitaly Shelest, >> >> >>"Howard Chivers" <[email protected]> wrote in message >>news:LISTSERV%[email protected]... >>> Hi, >>> >>> I've been trying to use jawin to wrap some User32 functions - many >>> thanks >>> for the framework & I'll be happy to donate any stubs that result. >>> However, I'm having problems with callbacks. >>> >>> I'd be grateful if anyone could have a quick look at the following; I >>> think >>> I've read the source correctly & it seems straightforward, but I'd be >>> grateful for confirmation. >>> >>> The following example wraps the EnumWindows function. Similar problems >>> occur with other enum functions. The code works correctly, and calls >>> back >>> to EnumWindowsProc, passing handles and lparam correctly; after >>> exactly >>> 5 >>> callbacks (and with lots more to enumerate) the system throws a > protection >>> exception - either protected code or access violation. (A more complex >>> example with enum child has convinced me that this is not a genuine >>> security problem). >>> >>> It is possible that I have not correctly worked out how to build the >>> return >>> from the callback, with the result that the stack is mangled on return >>> from >>> callback? or is this likley to be a bug? >>> >>> Thanks >>> Howard >>> >>> -------- >>> public void debugEnumWindows() throws COMException, IOException { >>> User32_a.EnumWindows(new EnumWindowsProc() { >>> public boolean call(int hWnd,int lParam) { >>> return true; >>> } >>> },0x99); >>> return; >>> } >>> -------------- >>> public static void EnumWindows(EnumWindowsProc ewp,int lParam) throws >>> IOException, COMException { >>> FuncPtr fp = new FuncPtr("user32.dll","EnumWindows"); >>> NakedByteStream nbs = new NakedByteStream(); >>> LittleEndianOutputStream leos = new LittleEndianOutputStream >>> (nbs); >>> leos.writeInt(0); >>> leos.writeInt(lParam); >>> byte[] res = fp.invoke("T2." + EnumWindowsProc.mtoken + "I::", >>> 8, nbs, new Object[] {ewp}, ReturnFlags.CHECK_FALSE); >>> return; >>> } >>> ----------------- >>> >>> public abstract class EnumWindowsProc extends WinFuncPtr { >>> >>> public static final int mtoken = GenericStub.registerCustomString >>> ("2II:I:"); >>> abstract public boolean call (int hWnd,int lParam) throws >>> IOException; >>> >>> protected byte[] call(byte[] inargs, Object[] inobjs) throws >>> IOException { >>> LittleEndianInputStream leis = new LittleEndianInputStream(new >>> ByteArrayInputStream(inargs)); >>> int hWnd = leis.readInt(); >>> int lParam = leis.readInt(); >>> boolean ret = call(hWnd,lParam); >>> NakedByteStream nbs = new NakedByteStream(); >>> LittleEndianOutputStream leos = new >>> LittleEndianOutputStream(nbs); >>> leos.writeInt(ret ? 1 : 0); >>> return nbs.getInternalBuffer(); >>> } >>> } >>> >>> >>> ----end------ >>> > I'm protected by SpamBrave http://www.spambrave.com/