[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Is it possible/acceptable to create a component in Gambas that depends on a shared library?


On Saturday, February 14th, 2026 at 21:00, Lee <t.lee.davidson@xxxxxxxxx> wrote:

> On 2/13/26 7:05 PM, gbWilly wrote:
> > I hijacked your project, created a Class LibC and started trying out stuff, like get the login name, that returns a pointer to a string. Yes, I managed to solve that one.
>
> The 'getlogin' function returns a pointer to a character array. Gambas will convert that to a Gambas string for you if you
> define the return type as String which you did for GetLogin(). The entire content of the LoginName_Read() property accessor
> function can simply be, just one line:
> "Return GetLogin()"
>
> For more info see https://gambaswiki.org/wiki/doc/extern under "String arguments" > "If the function returns a char *".

I have read that page many times over now :-)

>
> > Next, dive into userdatabase. Retrieve info based on userid. This info is returned as a Struct and indicated it returns a pointer.
> >
> > Here is where I get stuc. I did mimic the structure in Gambas (that is my understanding of what I need to do from wiki). Declare my extern function As this structure and run it.
>
> That is correct.
>
>
> > Now, how do I get to see the data? That's where I'm stuck.
> > I could use a little help here, as I didn't manage.
>
> A pointer to a struct is essentially a "handle" on the object of that structure. A variable needs to be defined that can receive
> that handle. So, you would need to do something like this:
> [code]
> Public Sub GetPointerWithUserId(UserId As Integer)
>
>    Dim hPassWd as PassWd
>
>    hPassWd = getpwuid(UserId)
>    '---What next to see for example PwDir or PwShell ?--
>    Print hPassWd.PwName
>    '... etc.
>
> End
> [/code]
>
I tried a struc like this:

Public Struct PassWd
    PwName As Pointer
    PwPasswd As Pointer
    PwUserId As Pointer
    PwGroupId As Pointer
    PwGecos As Pointer
    PwDir As Pointer
    PwShell As Pointer
End Struct

So, I used Pointers for all instead of String and Integer.
That solved the segfault and it does a Print String@(hPassWd.PwName).
So, it did need type Pointer after all.

> Sidenote: To get the member values of the (h)PassWd structure to the Main module you would need to either:
> 1. Store the handle/data as a property/properties in the LibC class which, AFAIK, cannot be done as it is created static, or
> 2. Pass the handle (hPassWd) back to Main from the function in LIbC which means you would need to move the Struct declaration to
> Main to be able to access the members there.

I have option 2 implemented and it works.

> In my opinion, Willy, you are making things more complicated than they need be at present with the creation of the LibC class. I
> recommend that you keep everything in Main until you get even more understanding of how things work when interfacing with
> external libraries.

In any project I take on, if I encounter things that might be useful in other projects I create a class for these within the project. These classes end up in my Gambas libraries. It is just the way I work.
This is such a case of testing all in a class to eventually with Gambas library  in the back of my mind (not this specific case but I need the practice anyway for other use cases).
I don't mind complicated, the best brain gymnastics there is and it improves my understanding and skills at the same time.

> > Documentation is bad, explains struct, but not in relation to how to use combined with a C library where a function returns a struct. One simple example would make a world of difference.
> Up until now, I have used external functions that take a pointer to a structure, that I have created, as an argument and fill in
> the structure. I can then access the members of the structure. I have now used LibC's 'getlocaltime' function that actually
> returns a pointer to a structure. It works.
>
> Example attached.

Thanks, I'll have a look at it

>
> I actually did receive the 'tar.gz' archive you sent as it did not get "scrubbed". But, I am sending this as 'gmail.txt' because
> I want to make sure you get it.

I can handle tar.gz just fine, I thought gmail was the problem.

>
> > P.S. I send it private as I don't want to further hijack the tread on the vlc component questions Claus asked, that doesn't seem to get answered somehow.
>
> Claus interjected those questions into what is actually my thread. I encouraged further discussion regarding his questions as
> IMO they were still very much on-topic. But, communicating privately is fine; though others on the list might also benefit from
> your learning experience.

Back to the list then with this reply

@list: you only missed some questions I had for Lee, above the returned answers and attached is what Lee send me

Time for me to have a look at what Lee has been cooking.

gbWilly
<salt FCKGM-0001-EF06-B09F-A33E>
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
</salt>