Thread overview
Pass reference to void*
Jan 07, 2019
Andre Pany
Jan 07, 2019
Stefan Koch
Jan 07, 2019
Andre Pany
Jan 09, 2019
Stefan Koch
Jan 09, 2019
Andre Pany
January 07, 2019
Hi,

I call a C function from a dll (SO on linux). While the following code works
fine for DMD on windows, there are strange errors for LDC on windows. Also the equivalent code does not work for DMD/LDC on linux.
(When calling other functions from the dll and passing the model reference, this functions are failing).

Function "Open" gets a path to a model and return via argument pModel the reference.
I am not 100% sure whether I call function Open correctly in regards to the pModel
argument.

extern(C) nothrow @nogc
{
	alias Model = void*;

	alias da_Open = Status function(const(char)* path, Model* pModel);
}

__gshared {
	da_Open Open;
}

Open = cast(da_Open) GetProcAddress(h, "Open");
Model model;
string modelFilePath = "...";

auto status = Open(modelFilePath.toStringz, &model);

Is &model correct?

Kind regards
André
January 07, 2019
On Monday, 7 January 2019 at 12:19:57 UTC, Andre Pany wrote:
> Hi,
>
> I call a C function from a dll (SO on linux). While the following code works
> fine for DMD on windows, there are strange errors for LDC on windows. Also the equivalent code does not work for DMD/LDC on linux.
> (When calling other functions from the dll and passing the model reference, this functions are failing).
>
> [...]

From the function declaration &model seems to be the correct thing to use here.
Have you checked that Open is not null ?
January 07, 2019
On Monday, 7 January 2019 at 13:01:57 UTC, Stefan Koch wrote:
> On Monday, 7 January 2019 at 12:19:57 UTC, Andre Pany wrote:
>> Hi,
>>
>> I call a C function from a dll (SO on linux). While the following code works
>> fine for DMD on windows, there are strange errors for LDC on windows. Also the equivalent code does not work for DMD/LDC on linux.
>> (When calling other functions from the dll and passing the model reference, this functions are failing).
>>
>> [...]
>
> From the function declaration &model seems to be the correct thing to use here.
> Have you checked that Open is not null ?

Yes, Open is not null and the strange thing is, everything is working fine for
DMD on windows. (I call a lot other dll functions afterwards).
By switching to LDC the subsequent calls to DLL functions are failing.

Thanks.

Kind regards
André
January 09, 2019
On Monday, 7 January 2019 at 13:15:44 UTC, Andre Pany wrote:
> On Monday, 7 January 2019 at 13:01:57 UTC, Stefan Koch wrote:
>> On Monday, 7 January 2019 at 12:19:57 UTC, Andre Pany wrote:
>>> [...]
>>
>> From the function declaration &model seems to be the correct thing to use here.
>> Have you checked that Open is not null ?
>
> Yes, Open is not null and the strange thing is, everything is working fine for
> DMD on windows. (I call a lot other dll functions afterwards).
> By switching to LDC the subsequent calls to DLL functions are failing.
>
> Thanks.
>
> Kind regards
> André

Might be an calling convention issue?

Are they declared with extern(Windows) ?
January 09, 2019
On Wednesday, 9 January 2019 at 18:37:57 UTC, Stefan Koch wrote:
> On Monday, 7 January 2019 at 13:15:44 UTC, Andre Pany wrote:
>> On Monday, 7 January 2019 at 13:01:57 UTC, Stefan Koch wrote:
>>> On Monday, 7 January 2019 at 12:19:57 UTC, Andre Pany wrote:
>>>> [...]
>>>
>>> From the function declaration &model seems to be the correct thing to use here.
>>> Have you checked that Open is not null ?
>>
>> Yes, Open is not null and the strange thing is, everything is working fine for
>> DMD on windows. (I call a lot other dll functions afterwards).
>> By switching to LDC the subsequent calls to DLL functions are failing.
>>
>> Thanks.
>>
>> Kind regards
>> André
>
> Might be an calling convention issue?
>
> Are they declared with extern(Windows) ?

I finally got it solved. The d coding was right. There was an error in the dll which caused an issue for LDC on Windows.
The SO (linux) I got working by chance. The SO has some dependencies to a system package. After installing this package by chance on my Alpine, the cryptic error message disappeared and everything works fine.

Kind regards
Andre