Hi Nicolas, Thank you for looking at the code. I was away and could not try your code.
On Thu, May 7, 2015 at 9:27 AM, p...@highoctane.be <p...@highoctane.be> wrote: > > > On Thu, May 7, 2015 at 1:06 AM, Nicolai Hess <nicolaih...@web.de> wrote: > >> >> >> 2015-05-06 22:47 GMT+02:00 Henrik Sperre Johansen < >> henrik.s.johan...@veloxit.no>: >> >>> A few easily fixed Type/pointers to Types mixups, and a slipup where two >>> different classes are confused for the same aside, the real show stopper, >>> if I haven't missed something entirely, is that the struct parser/NB in >>> general does not handle const sized arrays*, which is used in a few of the >>> required structs. >>> >>> Extending the parser should be relatively straight forward, along the >>> lines of adding >>> stream peek: #'[' ifTrue: [stream next. >>> type := SizedExternalArrayType type: type size: stream next. >>> stream next = #']' ifFalse: [self error: 'Missing closing bracket for >>> ', type printString]] >>> to NBExtenralStructureFields >> #parseFields:... after the name is read. >>> >>> Coding SizedExternalArrayType is a bit more work though... >>> >>> Cheers, >>> Henry >>> >>> >>> *The end goal would be to be able to generate accessors/read/write for a >>> simple test-struct such as >>> #fieldsDesc >>> ^#( >>> char ip[MyClassVar +2]; >>> ) >>> >> >> Yes, a parser for this would be great. >> >> I tried it with a little hack >> >> NBExternalStructure subclass: #Char_260 ... >> >> Char_260 class>>#fieldDesc >> ^ #(char data) >> >> Char_260 class>>instanceSize >> ^ 260 >> >> You need another accessor for accessing the data, otherwise you'll only >> get the first char. AND I don't know how >> the external memory is handle, probably it is never freed :) >> >> Now a complete example (attached code) call it with >> GetMacWin32 getMacAddress >> > > > Code loads fine on my 3.0 > same here. > > But hiccup on: > > resolveType: aTypeName > " a type name could be > - a class variable name > - a class name > - a type name > - a type name, followed by arbitrary number pointer chars - $*" > > | name newName resolver binding ptrArity | > newName := aTypeName. > ptrArity := 0. > "resolve aliases and pointers" > [ > name := newName trimRight. <<<--------------- HERE - as newName is a > subclass of NBExternalStructure, so no trimRight > newName := self aliasForType: name. > newName last = $* ifTrue: [ > ptrArity := ptrArity + 1. > newName := newName allButLast ]. > name = newName ] whileFalse. > > I changed to name := newName asString trimRight. > this worked for me. > > Call worked then but output gives this: > > GetMacWin32 getMacAddress 'BYTE_8 ( > data: $¼ <-- some weird string here > )' > It worked for me, I didn't encounter the problem of strange characters. I get: 000c29ab70960000 The last 4 trailing zeros are not the part of the mac address and I am not sure why these are getting added. I'll have a look at your code. thanks again. usman > Also, I wonder why you call the primGet... twice > > getMacAddressOf: iInterface > | ptr ptr2 nul ret | > ptr := NativeBoost allocate: 4. > nul := NativeBoost allocate: 0. > ptr nbUInt32AtOffset: 0 put: 0. > ret := self primGetAdaptersInfo: nul length: ptr. > ret = 111 "ERROR_BUFFER_OVERFLOW" > ifTrue: [ > | size | > size := ptr nbUInt32AtOffset: 0. > ptr2 := NativeBoost allocate: size. > ret := self primGetAdaptersInfo: ptr2 length: ptr. > ret = 0 "NO_ERROR" > ifTrue: [ > | pip numberOfInterfaces| > numberOfInterfaces := size / IpAdapterInfo instanceSize. > (iInterface between:1 and: numberOfInterfaces) ifFalse:[ ^ nil]. > pip := (NBExternalArray ofType: IpAdapterInfo) onAddress: ptr2 size: > numberOfInterfaces. > ^ (pip at:iInterface ) Address asString]]. > ^ nil > > Phil > > > > > >> >> >>> >>> On Wed, May 6, 2015 at 5:28 PM, Esteban Lorenzano <esteba...@gmail.com> >>> wrote: >>> >>>> >>>> On 06 May 2015, at 17:03, Nicolai Hess <nicolaih...@web.de> wrote: >>>> >>>> >>>> >>>> 2015-05-06 16:40 GMT+02:00 Esteban Lorenzano <esteba...@gmail.com>: >>>> >>>>> >>>>> On 06 May 2015, at 12:10, p...@highoctane.be wrote: >>>>> >>>>> I've loaded your package. >>>>> >>>>> A prerequisite is to load OS-Window to make it work. >>>>> >>>>> >>>>> why? >>>>> in any case, oswindow is already included in pharo4 >>>>> >>>> >>>> OS-Windows (by TorstenBergmann) >>>> >>>> not >>>> OSWindow :) >>>> >>>> >>>> ahhh. Name clash :) >>>> >>>> >>>> It is needed for the shared pool WinTypes, >>>> but without OS-Window, he can use NBWinTypes instead. >>>> >>>> >>>> >>>>> >>>>> Esteban >>>>> >>>>> >>>>> I've got the DLL call working nicely and the nativeboost with the >>>>> structure freezing. >>>>> >>>>> Now, we should all have a look at: >>>>> >>>>> https://github.com/ronsaldo/bullet-pharo >>>>> >>>>> and >>>>> >>>>> https://github.com/ronsaldo/swig >>>>> >>>>> because it looks like the way to go to wrap libraries... >>>>> >>>>> Ronie, I know you modified swig for generating Pharo code; >>>>> >>>>> Is cloning your swig repo the way to go ? >>>>> >>>>> >>>>> Phil >>>>> >>>>> >>>>> >>>>> >>>>> On Wed, May 6, 2015 at 10:39 AM, Usman Bhatti <usman.bha...@gmail.com> >>>>> wrote: >>>>> >>>>>> Hi Nicolai, >>>>>> >>>>>> Here is my package that defines the nativeboost call and associated C >>>>>> structs. >>>>>> The external C struct is self referencing and hence sometimes I get >>>>>> infinite recursion when trying to change field descriptions. That is the >>>>>> reason why the automatically generated accessors are absent (although I >>>>>> had >>>>>> them in an earlier version). >>>>>> >>>>>> Attached also the DLL referenced in the code. >>>>>> >>>>>> >>>>>> >>>>>> On Wed, May 6, 2015 at 9:58 AM, Nicolai Hess <nicolaih...@web.de> >>>>>> wrote: >>>>>> >>>>>>> >>>>>>> >>>>>>> 2015-05-06 9:53 GMT+02:00 Usman Bhatti <usman.bha...@gmail.com>: >>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> On Tue, May 5, 2015 at 7:34 PM, p...@highoctane.be < >>>>>>>> p...@highoctane.be> wrote: >>>>>>>> >>>>>>>>> >>>>>>>>> On Tue, May 5, 2015 at 6:28 PM, Usman Bhatti < >>>>>>>>> usman.bha...@gmail.com> wrote: >>>>>>>>> >>>>>>>>>> I succeeded to do it by encapsulating the C routine as a DLL and >>>>>>>>>> doing an FFI call from my image (as suggested by Guille). >>>>>>>>>> >>>>>>>>> >>>>>>>>> At least there was a way! >>>>>>>>> >>>>>>>> >>>>>>>> Exactly :) >>>>>>>> >>>>>>>> >>>>>>>>> >>>>>>>>> Looks like this is the most controlled|debuggable way: >>>>>>>>> - get it working with C code out of Pharo >>>>>>>>> - make a bridge that can be used easily with FFI in a dll >>>>>>>>> - use that from Pharo with proven FFI >>>>>>>>> >>>>>>>>> Would NativeBoost work with your dll? Should. >>>>>>>>> >>>>>>>> >>>>>>>> I have read a few resources about Nativeboost but I am still naive >>>>>>>> to know the difference between FFI and nativeboost. The FFI call I >>>>>>>> made to >>>>>>>> invoke the DLL function looked similar to the nativeboost calls. >>>>>>>> >>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> I also tried to perform the nativeboost call by creating my >>>>>>>>>> structures in Pharo. The function in Windows that can be used to >>>>>>>>>> retrieve >>>>>>>>>> mac address in Windows: GetAdaptersInfo >>>>>>>>>> <https://msdn.microsoft.com/en-us/library/windows/desktop/aa365917%28v=vs.85%29.aspx> >>>>>>>>>> that >>>>>>>>>> accepts a PIP_ADAPTER_INFO >>>>>>>>>> <https://msdn.microsoft.com/en-us/library/windows/desktop/aa366062(v=vs.85).aspx> >>>>>>>>>> structure. >>>>>>>>>> I subclassed NBExternalStructure to define this struct and the other >>>>>>>>>> used >>>>>>>>>> by it in the image but my NB call returned with 87 code (Invalid >>>>>>>>>> parameter) >>>>>>>>>> and it was impossible to debug. However, I would like to make this >>>>>>>>>> thing >>>>>>>>>> work to understand what went wrong. >>>>>>>>>> >>>>>>>>> >>>>>>>>> Has this something to do with 32|64 bit library complications? >>>>>>>>> >>>>>>>> >>>>>>>> Not exactly. For me, it was more related to the fact that I had to >>>>>>>> map a complex C struct in Pharo. Here is an excerpt of the definition >>>>>>>> from >>>>>>>> MSDN: >>>>>>>> >>>>>>>> typedef struct _IP_ADAPTER_INFO { >>>>>>>> struct _IP_ADAPTER_INFO *Next; >>>>>>>> ... >>>>>>>> PIP_ADDR_STRING CurrentIpAddress; >>>>>>>> IP_ADDR_STRING GatewayList; >>>>>>>> ... >>>>>>>> } >>>>>>>> >>>>>>>> So, I had to define three external structures (all names in >>>>>>>> capitals) and I did the effort but in the end I got an error code that >>>>>>>> I >>>>>>>> could not debug in the image. Hence, I gave up and opted to go in the >>>>>>>> native environment. But I would like someone knowledgable to have a >>>>>>>> look at >>>>>>>> my nativeboost code because the nativeboost approach is more simple >>>>>>>> (everything's in the image). >>>>>>>> >>>>>>> >>>>>>> I can have a look. >>>>>>> >>>>>>> btw. for what do you need the mac address? >>>>>>> >>>>>>> >>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> usman >>>>>>>> >>>>>>>> >>>>>>>>> >>>>>>>>> Phil >>>>>>>>> >>>>>>>>> With ProcessWrapper, I could not load the classes essential for >>>>>>>>> making the plugin work. >>>>>>>>> >>>>>>>>> HTH, >>>>>>>>> >>>>>>>>> Usman >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> On Mon, May 4, 2015 at 2:54 PM, Ben Coman <b...@openinworld.com> >>>>>>>>> wrote: >>>>>>>>> As a complete newb to VM building I found this fairly straight >>>>>>>>> forward (on a Mac btw). >>>>>>>>> https://github.com/pharo-project/pharo-vm >>>>>>>>> cheers -ben >>>>>>>>> >>>>>>>>> On Mon, May 4, 2015 at 5:28 PM, Usman Bhatti < >>>>>>>>> usman.bha...@gmail.com> wrote: >>>>>>>>> >>>>>>>>> >>>>>>>>> On Sun, May 3, 2015 at 4:22 PM, Pierce Ng <pie...@samadhiweb.com> >>>>>>>>> wrote: >>>>>>>>> On Sat, May 02, 2015 at 03:55:47PM +0200, Usman Bhatti wrote: >>>>>>>>> > 1/ OSProcess: I tried (PipeableOSProcess command: 'ipconfig >>>>>>>>> /all') output. >>>>>>>>> >>>>>>>>> I have used http://www.smalltalkhub.com/#!/~hernan/ProcessWrapper >>>>>>>>> successfully >>>>>>>>> back when I was on Windows using some now-ancient version of Pharo. >>>>>>>>> >>>>>>>>> I had initially discarded the idea of using this project because >>>>>>>>> it required a plugin and the information of the plugin was outdated on >>>>>>>>> squeaksource. However, having evaluated superficially the complexity >>>>>>>>> of >>>>>>>>> doing it with nativeboost (because too many external c struct >>>>>>>>> involved in >>>>>>>>> the call), I would like to see if I am better off using this wrapper. >>>>>>>>> >>>>>>>>> I loaded it with: >>>>>>>>> >>>>>>>>> Gofer it >>>>>>>>> url: 'http://www.smalltalkhub.com/mc/hernan/ProcessWrapper/main >>>>>>>>> '; >>>>>>>>> package: 'ProcessWrapper-Core'; >>>>>>>>> package: 'ProcessWrapper-Plugin'; >>>>>>>>> package: 'ProcessWrapper-Tests'; >>>>>>>>> load. >>>>>>>>> >>>>>>>>> But the plugins wont load because it requires the >>>>>>>>> class SmartSyntaxInterpreterPlugin and apparently this file is a part >>>>>>>>> of >>>>>>>>> the VMMaker. Is there any recent config for VMMaker in Pharo because >>>>>>>>> this >>>>>>>>> one looks outdated: >>>>>>>>> >>>>>>>>> http://pharo.gemtalksystems.com/book/Virtual-Machine/Building/VMMakerTool/ >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>>> >>>>>>>>>> Pierce >>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>> >>>>> >>>>> >>>> >>>> >>> >> > > > -- > --- > Philippe Back > Visible Performance Improvements > Mob: +32(0) 478 650 140 | Fax: +32 (0) 70 408 027 > Mail:p...@highoctane.be | Web: http://philippeback.eu > Blog: http://philippeback.be | Twitter: @philippeback > Youtube: http://www.youtube.com/user/philippeback/videos > > High Octane SPRL > rue cour Boisacq 101 | 1301 Bierges | Belgium > > Pharo Consortium Member - http://consortium.pharo.org/ > Featured on the Software Process and Measurement Cast - > http://spamcast.libsyn.com > Sparx Systems Enterprise Architect and Ability Engineering EADocX Value > Added Reseller > > >