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

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

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

Petr-9
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@XmlTransaction@DbXml@@QAEXXZ
00000000 I _imp_?abort@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@XmlResults@DbXml@@QAEXABVXmlValue@2@@Z
00000000 I _imp_?add@XmlResults@DbXml@@QAEXABVXmlValue@2@@Z
          U _IMPORT_DESCRIPTOR_libdbxml22

Any pointers to some resources how should I continue are appreciated.

--Petr


Reply | Threaded
Open this post in threaded view
|

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

Andreas.Raab
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@XmlTransaction@DbXml@@QAEXXZ
> 00000000 I _imp_?abort@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@XmlResults@DbXml@@QAEXABVXmlValue@2@@Z
> 00000000 I _imp_?add@XmlResults@DbXml@@QAEXABVXmlValue@2@@Z
>          U _IMPORT_DESCRIPTOR_libdbxml22
>
> Any pointers to some resources how should I continue are appreciated.
>
> --Petr
>
>
>


Reply | Threaded
Open this post in threaded view
|

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

Petr-9
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@XmlTransaction@DbXml@@QAEXXZ
>> 00000000 I _imp_?abort@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@XmlResults@DbXml@@QAEXABVXmlValue@2@@Z
>> 00000000 I _imp_?add@XmlResults@DbXml@@QAEXABVXmlValue@2@@Z
>>          U _IMPORT_DESCRIPTOR_libdbxml22
>>
>> Any pointers to some resources how should I continue are appreciated.
>>
>> --Petr
>>
>>
>>
>
>
>



Reply | Threaded
Open this post in threaded view
|

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

Andreas.Raab
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@XmlTransaction@DbXml@@QAEXXZ
>>> 00000000 I _imp_?abort@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@XmlResults@DbXml@@QAEXABVXmlValue@2@@Z
>>> 00000000 I _imp_?add@XmlResults@DbXml@@QAEXABVXmlValue@2@@Z
>>>          U _IMPORT_DESCRIPTOR_libdbxml22
>>>
>>> Any pointers to some resources how should I continue are appreciated.
>>>
>>> --Petr
>>>
>>>
>>>
>>
>>
>>
>
>
>
>