2016-05-19 8:56 GMT+02:00 Nicolai Hess <[hidden email]>:
From my observation, hInst := NativeBoostWin32 getVMModuleHandle. hInst is not considered an external object, or its handle is not an ExternalAddress, although the object is a WinHandle that is a subclass of FFIExernalReference :-( I am lost here, any help appreciated.
|
2016-05-30 14:59 GMT+02:00 Nicolai Hess <[hidden email]>:
Please. (I do undestand that a winhandle is only a number and not a external memory. But how to handle this "handles" when passing to a external function ?)
|
I’m sorry… I do not understand. This is solved in UFFI since some months, and Torsten’s OSWindow uses it. UFFI provides FFIConstantHandle type to deal with windows HANDLE types, as comment says: I represent a constant HANDLE, as described in *Windows MSDN>https://msdn.microsoft.com/en-us/library/windows/desktop/ms724457(v=vs.85).aspx* A ==HANDLE== is a special kind of external object who is accessed through numbers, therefore and ==ExternalAddress== is not appropriate to describe it (since they are constants and external addresses represents disposable spaces from memory). Is not clear this is necessary outside Windows, but according to documentation they are somekind analogous to unix's File Descriptors (but with some remarkable diferences, as documented *here>http://lackingrhoticity.blogspot.fr/2015/05/passing-fds-handles-between-processes.html*. Example: [[[ HWND := #FFIConstantHandle. self ffiCall: #(HWND GetActiveWindow()) ]]] is there anything I’m missing? Esteban
|
Sorry then it is my fault. I know that Torsten already ported OSWindow to UFFI, and that most things are already working.
I don't know what else should I do, I already posted the example. The code I provided just don't work (DNU on isExternalAddress, see other mail), and I have no idea how to make it work. Yes, maybe I don't know enough about ffi for this type of the function argument passing. (actually I tried to port some NBOpenGL code to UFFI, for this I need to register a Window Class with WinWndClassEx (to create a gl context). So if this *is* already working, I need to look what I have done wrong). thanks for your response. nicolai
|
the example is a simplification, you cannot put both definition and call in same method… find attached a working example of what you want.
HandleExample.st (929 bytes) Download Attachment |
2016-06-24 14:05 GMT+02:00 Esteban Lorenzano <[hidden email]>:
Thank you!
|
… and I enhanced the example to not induce to confusion anymore :)
Esteban
|
2016-06-24 14:32 GMT+02:00 Esteban Lorenzano <[hidden email]>:
Sorry, I must be stupid, it still does not work ( and it actually looks the same as with the existing WinHandle type).
|
well, that I don’t know… for me it works, I tested it in Win10 and it was fine. What exactly are you trying to do? Esteban
|
In reply to this post by Nicolai Hess-3-2
ah, and which VM are you using?
|
In reply to this post by EstebanLM
2016-06-24 14:52 GMT+02:00 Esteban Lorenzano <[hidden email]>:
What was fine?
As I wrote, I try to get the vmmodule handle (WinProcess getVMModuleHandle) and assign it to the hInstance field of a WinWndClassEx, getting the vm module handle works, (both, if I use the existing WinHandle type or (like you) a direct FFIConstantHandle). But assigning this value to the hInstance field always gives a DNU MessageNotUnderstood: SmallInteger>>isExternalAddress I do understant that a WinHandle is not an external (memory) resource and has no external address. I just don't undestand how to pass this type of arguments.
|
if you send me the code, I can take a look.
|
2016-06-24 16:03 GMT+02:00 Esteban Lorenzano <[hidden email]>:
Sorry if this sounds rude, but did you actually read my mail, I mean the first one. If you don't have the time to look at this, it is ok. I will just try to find it out myself, or maybe torsten has an idea. No problem. I already posted the code multiple times. There is no code I could send. It is all in the image (+ the OSWindow) project. I'll try it again. OS: Windows - take a fresh - load (from catalog browser) OSWindow - execute this | hInst wndClass | hInst := WinProcess getVMModuleHandle. wndClass := WinWndClassEx new. wndClass hInstance: hInst. Error : Unable to resolve external type: HMODULE OK, getVMModuleHandle expects a HMODULE type We need to define a missing type, HMODULE, but that works (just like all the other H-WinHandle-Types). Now execute it again: New error: "MessageNotUnderstood: SmallInteger>>isExternalAddress" The question is: Any Idea what is missing here, I need a way to store the HMODULE handle in the structure of the WinWNdClassEx |
well… after search, it was from 25 apr… and my client didn’t show it to me (because I removed it, to clean)… and it folded the quoted so yes, I read it… like a month ago :)
well, but I’m particularly interested in UFFI, since is my new toy :) and seriously, I want to make him really solid, so I jump in whenever I see a problem, even if I’m doing something different (merging pharo-vm with os-vm, now). Anyway, I see the error: WinWndClassEx is generated with bad mapping… this is fixed in new versions of UFFI so you need to regenerate the fields: WinWndClassEx rebuildFieldAccessors. (Torsten needs to but then… I spotted a bug, because FFIConstantHandle>>value is not defined so you will still have an error :) anyway, I updated both, OSWindow and UFFI so if I you load bleedingEdge of both, you will see something like this:
|
Yes! That is much better, thanks2016-06-24 17:16 GMT+02:00 Esteban Lorenzano <[hidden email]>:
|
In reply to this post by EstebanLM
Example in chapter please :) Le 24/6/16 à 14:05, Esteban Lorenzano a
écrit :
|
Free forum by Nabble | Edit this page |