calling c++ functions using ffi (berkeley dbxml under windows)

Andreas Raab andreas.raab at gmx.de
Sat Oct 28 22:08:18 UTC 2006


You create memory locations that the function can store into, like here:

   majorp := IntegerArray new: 1.
   minorp := IntegerArray new: 1.
   patchp := IntegerArray new: 1.

   self dbxmlVersion: majorp with: minorp with: patch

   major := majorp at: 1.
   minor := minorp at: 1.
   patch := patchp at: 1.

(the above assumes that the arguments in your function are declared as 
long* which I presume they are)

Cheers,
   - Andreas


Petr wrote:
> Hello again!
> So I found out how to get the function names and I can successfully call
> them. As it is for me sufficient to run my program under windows, I am
> going to use the mangled names, without a C wrapper. However, I have
> another problem. How do I get values from functions, which return 
> multiple values using a pointer? For example:
> 
>     void DbXml::dbxml_version(int *majorp, int *minorp, int *patchp)
> 
> --Petr
> 
> 
> Andreas Raab wrote:
>> A very good article is here:
>>
>>   http://en.wikipedia.org/wiki/Name_mangling
>>
>> The FFI doesn't do name mangling so for calling C++ functions so you 
>> either need to provide the mangled name or provide a wrapper function 
>> (via extern "C").
>>
>> Cheers,
>>   - Andreas
>>
>> Petr wrote:
>>> Hello,
>>> I am trying to use Berkeley DB XML from withing Squeak. I already 
>>> found out how to call C functions, but I got stuck on "Error : can't 
>>> find function address" when calling a function in a C++ shared 
>>> library. So I first looked up some info on the Squeak wiki and found 
>>> this: http://minnow.cc.gatech.edu/squeak/3735. I used nm from mingw 
>>> on the libdbxml22.lib and got a lot of some information I do not 
>>> exactly understand. An example:
>>>
>>> libdbxml22.dll:
>>> 00000000 I .idata$4
>>> 00000000 I .idata$5
>>> 00000000 I .idata$6
>>> 00000000 T .text
>>> 00000000 T ?abort at XmlTransaction@DbXml@@QAEXXZ
>>> 00000000 I _imp_?abort at XmlTransaction@DbXml@@QAEXXZ
>>>          U _IMPORT_DESCRIPTOR_libdbxml22
>>>
>>> libdbxml22.dll:
>>> 00000000 I .idata$4
>>> 00000000 I .idata$5
>>> 00000000 I .idata$6
>>> 00000000 T .text
>>> 00000000 T ?add at XmlResults@DbXml@@QAEXABVXmlValue at 2@@Z
>>> 00000000 I _imp_?add at XmlResults@DbXml@@QAEXABVXmlValue at 2@@Z
>>>          U _IMPORT_DESCRIPTOR_libdbxml22
>>>
>>> Any pointers to some resources how should I continue are appreciated.
>>>
>>> --Petr
>>>
>>>
>>>
>>
>>
>>
> 
> 
> 
> 




More information about the Squeak-dev mailing list