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
|