Hello, I need to call the following function:

/**
 * Notifies Purple that a buddy's status has been activated.
 *
 * This is meant to be called from protocol plugins.
 *
 * @param account   The account the user is on.
 * @param name      The name of the buddy.
 * @param status_id The status ID.
 * @param ...       A NULL-terminated list of attribute IDs and values,
 *                  beginning with the value for @a attr_id.
 */
void purple_prpl_got_user_status(PurpleAccount *account, const char *name,
                                                           const char 
*status_id, ...) G_GNUC_NULL_TERMINATED;


I have translated it as follows:

procedure purple_prpl_got_user_status(account: PPurpleAccount;
  name_, status_id: PChar; par3: array of const); cdecl; external LIBPURPLE;

and I call it with [] as the last parameter because I never need it
anyways. This works in 50% of all cases, when it works it works
always, when I crashes (on x64 for example) then it crashes always.
When I slightly move around the function call, add some debug output
before and after the call so that the stack is layed out differently
(different garbage on the stack) then it will start working where it
previously crashed or crash where it previously worked.

How is this such a list of arguments actually implemented? is it on
the stack? What structure does it have? Can I somehow manually put
stuff onto the stack to make it think it is an empty list? maybe pass
another integer and pass 0 instead of this list?

Bernd
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to