Thread overview | |||||||||
---|---|---|---|---|---|---|---|---|---|
|
October 25, 2017 call Pascal DLL functions from D | ||||
---|---|---|---|---|
| ||||
Hello. I have DLL written on Pascal and "headers" for use it (types and functions signatures definitions). How I can port "headers" to D? Calling convention is `stdcall` (`extern (Windows)` for D), arguments of some functions is structs of structs and etc with static array fields: ```Pascal type TOneHarmonic = record Koef: Single; Angle: Single; end; THarmonicsArray = array[2..50] of TOneHarmonic; TInterharmonicsArray = array[1..49] of TOneHarmonic; TVoltageCurrentOneFaza = record KalibKoef: Single; IncludeMainFreq: Boolean; MainFreqVoltCur: TOneHarmonic; Harmonics: THarmonicsArray; Interharmonics: TInterharmonicsArray; end; TVoltageCurrent = record Enable: Boolean; NominalID: Byte; Faza_A: TVoltageCurrentOneFaza; Faza_B: TVoltageCurrentOneFaza; Faza_C: TVoltageCurrentOneFaza; end; TSignal = record HasInterharmonics: Boolean; Voltage: TVoltageCurrent; Current: TVoltageCurrent; ... end; ... ``` in other file ```Pascal function CheckSignalData(SignalData: PUserSignalData): Word; stdcall; external SIGNALK2MDLL; ``` PUserSignalData is pointer to TUserSignalData, first field of TUserSignalData is Signal, other fields is pointers to other types If I understand correctly 1. `Single` is `float` in D, `Byte` is `byte`, `Boolean` is `bool`, `Word` is `ushort` 2. `array[A..B] of TFoo` is `TFoo[B-A+1]` (static array) Can I rewrite records to structs like this? ```d alias Word = short; alias Single = float; alias Byte = byte; alias Boolean = bool; struct OneHarmonic { Single coef; Single angle; } alias HarmonicArray = OneHarmonic[49]; // TVoltageCurrentOneFaza struct PhaseInfo { // Must I align fields and/or structs? Single calibCoef; Boolean includeMainFreq; OneHarmonic mainFreqVoltCur; HarmonicArray harmonics; // Can I replace Pascal static arrays with D static arrays? HarmonicArray interharmonics; } // TVoltageCurrent struct ChannelInfo { Boolean enable; Byte nominalID; PhaseInfo[3] phase; // Can I replace 3 fields to static array? } struct Signal { Boolean hasInterharmonics; ChannelInfo voltage; ChannelInfo current; // #1 ... } ``` In this case I have error about current values (#1) and I think I badly rewrite Pascal records to D structs (ChannelInfo, PhaseInfo, OneHarmonic) and lose alignments and/or something else. PS original pascal naming is very bad, I know |
October 25, 2017 Re: call Pascal DLL functions from D | ||||
---|---|---|---|---|
| ||||
Posted in reply to Oleg B | On Wednesday, 25 October 2017 at 03:12:56 UTC, Oleg B wrote: > Calling convention is `stdcall` (`extern (Windows)` for D), arguments of some functions is structs of structs and etc with static array fields: Fun fact, D has extern(Pascal): https://dlang.org/spec/attribute.html#linkage I don't know the details of the rest... but I think you're right about what you have so far. I'd suggest just trying it and seeing if the functions return what you expect. |
October 25, 2017 Re: call Pascal DLL functions from D | ||||
---|---|---|---|---|
| ||||
Posted in reply to Oleg B | On Wednesday, 25 October 2017 at 03:12:56 UTC, Oleg B wrote: > Hello. I have DLL written on Pascal and "headers" for use it (types and functions signatures definitions). How I can port "headers" to D? > > Calling convention is `stdcall` (`extern (Windows)` for D), arguments of some functions is structs of structs and etc with static array fields: > > ```Pascal > type > TOneHarmonic = record > Koef: Single; > Angle: Single; > end; > > THarmonicsArray = array[2..50] of TOneHarmonic; > TInterharmonicsArray = array[1..49] of TOneHarmonic; > > TVoltageCurrentOneFaza = record > KalibKoef: Single; > IncludeMainFreq: Boolean; > MainFreqVoltCur: TOneHarmonic; > Harmonics: THarmonicsArray; > Interharmonics: TInterharmonicsArray; > end; > > TVoltageCurrent = record > Enable: Boolean; > NominalID: Byte; > Faza_A: TVoltageCurrentOneFaza; > Faza_B: TVoltageCurrentOneFaza; > Faza_C: TVoltageCurrentOneFaza; > end; > > TSignal = record > HasInterharmonics: Boolean; > Voltage: TVoltageCurrent; > Current: TVoltageCurrent; > ... > end; > ... > ``` > > in other file > > ```Pascal > function CheckSignalData(SignalData: PUserSignalData): Word; > stdcall; external SIGNALK2MDLL; > ``` > PUserSignalData is pointer to TUserSignalData, first field of TUserSignalData is Signal, other fields is pointers to other types > > If I understand correctly > 1. `Single` is `float` in D, `Byte` is `byte`, `Boolean` is `bool`, `Word` is `ushort` No Pascal's "Byte" is D's "ubyte". But unless NominalID goes over 127 this is not the source of the problem. > 2. `array[A..B] of TFoo` is `TFoo[B-A+1]` (static array) No A-B. In Pascal the upper bound of a range (like here but i'm not sure this i called like that in the grammar) or of a slice is inclusive. > > Can I rewrite records to structs like this? > > ```d > alias Word = short; > alias Single = float; > alias Byte = byte; > alias Boolean = bool; > > struct OneHarmonic > { > Single coef; > Single angle; > } > > alias HarmonicArray = OneHarmonic[49]; 48 ! > // TVoltageCurrentOneFaza > struct PhaseInfo > { > // Must I align fields and/or structs? No, unless the record is packed. > Single calibCoef; > Boolean includeMainFreq; > OneHarmonic mainFreqVoltCur; > HarmonicArray harmonics; // Can I replace Pascal static arrays with D static arrays? > HarmonicArray interharmonics; > } > > // TVoltageCurrent > struct ChannelInfo > { > Boolean enable; > Byte nominalID; > PhaseInfo[3] phase; // Can I replace 3 fields to static array? yes > } > > struct Signal > { > Boolean hasInterharmonics; > ChannelInfo voltage; > ChannelInfo current; // #1 > ... > } > ``` > > In this case I have error about current values (#1) and I think I badly rewrite Pascal records to D structs (ChannelInfo, PhaseInfo, OneHarmonic) and lose alignments and/or something else. > > PS original pascal naming is very bad, I know Most likely the problem is the array length. |
October 25, 2017 Re: call Pascal DLL functions from D | ||||
---|---|---|---|---|
| ||||
Posted in reply to Oleg B | On Wednesday, 25 October 2017 at 03:12:56 UTC, Oleg B wrote: > Hello. I have DLL written on Pascal and "headers" for use it (types and functions signatures definitions). How I can port "headers" to D? > > [...] Hi, this thread might be interesting for you, if you use Delphi http://forum.dlang.org/post/hpodoabutuakfxbzzcyy@forum.dlang.org This thread describes a bridge between the D Programming Language and Delphi. Kind regards André |
October 25, 2017 Re: call Pascal DLL functions from D | ||||
---|---|---|---|---|
| ||||
Posted in reply to Basile B. | On Wednesday, 25 October 2017 at 04:30:12 UTC, Basile B. wrote:
> On Wednesday, 25 October 2017 at 03:12:56 UTC, Oleg B wrote:
>> 2. `array[A..B] of TFoo` is `TFoo[B-A+1]` (static array)
>
> No A-B. In Pascal the upper bound of a range (like here but i'm not sure this i called like that in the grammar) or of a slice is inclusive.
>
>> alias HarmonicArray = OneHarmonic[49];
>
> 48 !
>
> Most likely the problem is the array length.
If I wrote `array[5..7] of ...` I get array that can be indexed by `5`, `6` and `7`, right? It means that array have 3 elements. If A=5, B=7 then length of array is B-A+1, 7-5+1=3. In my case I have [1..49] and [2..50] ranges: 49-1+1=49, 50-2+1=49. I don't understand why length must be 48...
In any case I tried 48 and CheckSignalData function returns other error code, but it point to current field too (incorrect value of coefs - it can be if floating point value is badly read).
|
October 25, 2017 Re: call Pascal DLL functions from D | ||||
---|---|---|---|---|
| ||||
Posted in reply to Adam D. Ruppe | On Wednesday, 25 October 2017 at 03:36:54 UTC, Adam D. Ruppe wrote:
> I'd suggest just trying it and seeing if the functions return what you expect.
Unfortunately they returns unexpected codes. Otherwise I wouldn't post question here. I go here then I have no idea to resolve problem.
|
October 25, 2017 Re: call Pascal DLL functions from D | ||||
---|---|---|---|---|
| ||||
Posted in reply to Oleg B | On Wednesday, 25 October 2017 at 10:47:56 UTC, Oleg B wrote:
> On Wednesday, 25 October 2017 at 04:30:12 UTC, Basile B. wrote:
> If I wrote `array[5..7] of ...` I get array that can be indexed by `5`, `6` and `7`, right? It means that array have 3 elements. If A=5, B=7 then length of array is B-A+1, 7-5+1=3. In my case I have [1..49] and [2..50] ranges: 49-1+1=49, 50-2+1=49. I don't understand why length must be 48...
Yeah of course, me neither.
|
Copyright © 1999-2021 by the D Language Foundation