How I ended up with the names api.ads, api.adb and api.def is an artefact from something I was reading. [This space set aside for an attribution.]
First up, api.ads, which declares the functions and exports them.
- function Factorial, which accepts a C.int and returns a C.int
- procedure Mangle, which accepts a Win32.LPWSTR and attempts the same dangerous stuff that Bob6 does in the ObjectAda version. Still working on this one.
- function Pattern, which returns a Win32.LPWSTR
- procedures Initialize_API, and Finalize_API, which I understand are mandatory. (If someone knows better, please tell me.)
Next, api.adb, where the declarations are explained.
Mangle replaces the incoming string with something of its own. If the incoming string is larger or the same size then everything's more or less okay. (Less in the latter case, but at least it doesn't crash.) However, if the incoming string is shorter, VB truncates up to the length it knows about, and who knows what damage we've done with whatever gets overwritten by the rest of
Pattern returns a pointer to the string data. Not knowing a lot about Ada, I don't know if the contents of
foowill still be there by the time VB looks it and reads out.
api.def lists the symbols exported, and is needed by gnatdll.
Now, pulling it all together requires some handwaving on the commandline.
The output from a run of these is as follows:
Now the VB code. Take note of a few things:
- Exporting as
DLLgenerates decorated names, but gnatdll was able to resolve the decorated ones with the undecorated ones specified in api.def
- For reasons I remember reading somewhere, initialize_api and finalize_api are mandatory, and must be the first and last calls to the DLL
- Seeing as woof woof woof woof is longer than foo man chew,
sends up containing foo man chew woof
Next stop is to get this working with "GNAT/GCC MS-Windows MinGW 4.2.1 R0". I would prefer to be working under the GMGPL.
© Copyright Bruce M. Axtens., 2007