Hi,

If I were to debug this, I would:

1 ) make sure there's no C++ interfering, try to compile using C
    compiler (not C++, I guess you run Windows  and MSVC, I think
    there's command line option to process file as C).
    If not possible, wrap all methods you want to call form St
    in extern "C" {} block. Does it work? If not, then C++ compiler
    is doing it's magic which NB doesn't.


2 ) If it does, run whole thing under debugger, set breakpoint to
    the faulty function and check that arguments are correct
    and what's return value.
    If args are incorrect, then the problem is in either yours or
    NB's code.
    If return value is correct, then the problem is also in
    either yours or NB's code.
    If the return value is incorrect, well then the problem could be
    either in the library or some sort of GC thing as GC moves stuff
    around, which most of C/C++ libraries don't like much.

    In that case, I learned, the only way us to read library's code
    and single-step through it to see that the code actually does with
    data you pass down.

HTH, Jan



On 23/05/14 10:51, Torsten Bergmann wrote:
Hi Jean,

thanks for answering. I dont think that the convention is an issue here: 
internally
it is written in C++, but it exposes the API as simple C functions. The calls 
with NB
work (even the callbacks).

What confuses me most is that the call to "wkhtmltopdf_set_global_setting"
works while the "wkhtmltopdf_set_object_setting"  does not. They have exactly
the same signature and are called one after the other. First one returns proper 
int 1 (success)
as in the non-Smalltalk example, the other one 0 which means it failed.

There is no magic in the Pharo code, just simple calls. Also the non-Smalltalk 
example
proves that the component is working. Maybe a side effect of NativeBoost itself?

Looks like so far I'm lost without the help of Igor here...

Thx
T.



Gesendet: Freitag, 23. Mai 2014 um 11:31 Uhr
Von: "Jean Baptiste Arnaud" <[email protected]>
An: "Pharo Development List" <[email protected]>
Betreff: Re: [Pharo-dev] NativeBoost and WKHTML

I think this is because it is a C++ lib.
NativeBoost cannot be used with C++ lib.
It is a problem of call convention that is not the same from C to C++.
As I discuss with some people it seems be a complexe problem, each C++ compiler 
seems have it own convention.
But Igor can maybe be more accurate about that.
A C wrapper to call C++, which should work.



On 23 May 2014, at 02:36, Torsten Bergmann <[email protected]> wrote: Hi,

as there was no responded so far I tried to track the problem deeper and did a 
short test
client in C/C++ to verify if I can call WKHTMLTOPDF there and generate a PDF 
and to
compare to the Pharo/NativeBoost client.

Attached is the according CPP file which works and results in a PDF with the 
google
homepage.

I also additionally implemented the callback functions in the Pharo wrapper and
using the error handling I noticed that the component returns "Failed loading page 
http:// ..."


With that info I compared the C/C++ calls to the Pharo/NativeBoost calls more 
deeply and
found out that in C/C++ the following call for an object setting works (by 
returning 1):


        // this returns 1 in C/C++ which is OK
int a = wkhtmltopdf_set_object_setting(os, "page", 
"http://www.google.de[http://www.google.de]";);
printf("object set %i",a);


while in Pharo the same call fails (by returning 0):

        "The following call failed and returns 0 instead of 1"
self setObjectSetting: 'page' to: 'http://www.google.de'[http://www.google.de'] 
in: os.

I checked how I wrapped this API call again and again - it is fine from my side:

    setObjectSetting: aName to: value in: settings

<primitive: #primitiveNativeCall module: #NativeBoostPlugin>

^NBFFICallout stdcall: #(int 
wkhtmltopdf_set_object_setting(wkhtmltopdf_object_settings* settings, char* 
aName, char* value)) module: 'wkhtmltox.dll'

and I still have no idea why it fails.

Especially because "wkhtmltopdf_set_object_setting" function is not different from 
"wkhtmltopdf_set_global_setting" which is exactly the same way wrapped, works
and returns 1 in exactly the same example.

I would really appreciate if someone could have a second look...

To reproduce on Windows:

1. Download the 32 bit version of WKHTML from 
http://wkhtmltopdf.org[http://wkhtmltopdf.org] and install it
2. Copy the "wkhtmltox.dll" to either the folder of the VM executable
    or the Windows directory so it can be found
3. Load the package WKHTML2PDF-Core-TorstenBergmann.7
    from 
http://smalltalkhub.com/#!/~TorstenBergmann/WKHTML2PDF[http://smalltalkhub.com/#!/~TorstenBergmann/WKHTML2PDF]
 into Pharo 3.0#30848
4. Check the Transcript while evaluating:

        WKPDFLibrary example

    One can see that within this code #setObjectSetting:to:in: fails while 
#setGlobalSetting:to:in:
    works.

Maybe I just do not see the obvious. Help is appreciated. Thanks in advance!

bye
T.


<main.cpp>

Best Regards
Jean Baptiste Arnaud
[email protected][[email protected]]






Reply via email to