Hi all,

2012/11/6 Igor Stasenko <[email protected]>

> On 2 November 2012 06:05, Torsten Bergmann <[email protected]> wrote:
> > Hi Igor,
> >
> > in Win32 often one passes NULL as argument
> > (for instance if a function has an argument "handle to a window", then
> > a hWnd of NULL can be given).
> >
> > For instance when I have
> >
> >    shellExecute: hwnd operation: lpOperation file: lpFile parameters:
> lpParameters directory: lpDirectory show: nShowCmd
> >                 <primitive: #primitiveNativeCall module:
> #NativeBoostPlugin>
> >
> >                 ^ self nbCall: #(
> >                         HINSTANCE ShellExecuteA(
> >                                 HWND hwnd,
> >                                 LPCTSTR lpOperation,
> >                                 LPCTSTR lpFile,
> >                                 LPCTSTR lpParameters,
> >                                 LPCTSTR lpDirectory,
> >                                 INT nShowCmd)) module: 'Shell32.dll'
> >
>
> usually it controlled by options for code generator
> like #optCoerceNilToNull
> which will allow you to pass nil as valid argument.
>
> What is missing, is that in your case you passing an instance of
> NBExternalObject,
> and NBExternalObjectType converter does not honors that option.
> This is easy to fix. I will add it as time allows me to do a pass on
> NativeBoost.
>
> >
> > The NBFFICallout class(NBNativeCodeGen
> class)>>handleFailureIn:nativeCode:
> > tells me that "an instance of NBWin32Window" is expected.
> >
> right, so what you can do is to synthesize an instance of
> NBWin32Window with handle value == 0.
> This will effectively behave as if you passed null argument. Sure it
> is not nearly elegant, so i mentioning it
> just for protocol :)
>
>
> > So currently I have to pass "NBWin32Window getFocus" as first
> > argument. But often this is not necessary.
> >
> Another way of doing this is use convenience methods. Like with your
> function,
> you could have two methods for it, one which takes window argument,
> and another which doesn't:
>
>
> shellExecute: lpOperation file: lpFile parameters: lpParameters
> directory: lpDirectory show: nShowCmd
>
>                  ^ self nbCall: #(
>                          HINSTANCE ShellExecuteA(
>                                  0,
>                                  LPCTSTR lpOperation,
>                                  LPCTSTR lpFile,
>                                  LPCTSTR lpParameters,
>                                  LPCTSTR lpDirectory,
>                                  INT nShowCmd)) module: 'Shell32.dll'
>

yes I like this NB feature of directly put real values in external call
definitions.
But, having a NULL constant could also makes sense:

^ self nbCall: #(
                         HINSTANCE ShellExecuteA(
                                 NULL,
                                 LPCTSTR lpOperation,
                                 LPCTSTR lpFile,
                                 LPCTSTR lpParameters,
                                 LPCTSTR lpDirectory,
                                 INT nShowCmd)) module: 'Shell32.dll'

perhaps NULL is already there somewhere, I never look for it ;-)

Luc


> like that, you exposed API in proper way, i.e. without forcing users
> to pass meaningless nils every time :)
> and of course, in a second form (one which takes window handle as
> argument), you would expect a valid window handle, but not
> nil/null/whatever. That way it makes things less error prone.
>
> > I also havent found a constant pool with NULL or an accessor.
> > Whats the prefered way to deal with NULL in NB?
> >
> >
> > Can you also please add me as a developer
> > to http://www.squeaksource.com/NativeBoost
> > My initials are "tbn"
> >
> done.
> > I would like to add several API functions for
> > Win32 (ShellExecute, OutputDebugString, ...)
> >
> go ahead :)
>
> > Thx
> > Torsten
>
>
>
> --
> Best regards,
> Igor Stasenko.
>
>

Reply via email to