Bonjour,
Je vous explique ce que j'essaye de faire.
Je developpe un plugin en C/obj-c pour 4D
Ce plugin utilise un framework toto
Pour initialiser le framework je dois faire ceci :
1 2 3 4 5 6
|
TotoAPIInvokeInterface vapiii;
TotoAPI *vapi;
TotoAPI_getInvokeInterface( &vapiii, PRODUCTID );
vapiii.TotoAPI_init( &vapi, PRODUCTID ); |
j'ai donc dans mon plugin plusieurs fonctions qui utilisent l'interface vapiii et l'api vapi
par exemple
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| void pkg_search_by_name( PA_PluginParameters params )
{
TotoAPIInvokeInterface vapiii;
TotoAPI *vapi;
TotoAPI_getInvokeInterface( &vapiii, PRODUCTID );
vapiii.TotoAPI_init( &vapi, PRODUCTID );
// --- Get input params
NSString *quoi = _GetStringParameter(params, 2);
NSLog(@"param NSSTRING :%@", quoi);
// --- write the code of pkg_SearchByName here...
PackList *packs = vapiii.PackService_searchByName( vapi, [quoi cStringUsingEncoding: NSUTF8StringEncoding] );
NSLog(@"NB Packs : %d", vapiii.PackList_getCount( packs ));
.../...
} |
Ce code fonctionne, mais mon problème est que l'initialisation de l'api est trés longue. Donc si je met dans toutes mes fonctions un appel à
vapiii.TotoAPI_init( &vapi, PRODUCTID );
cela sera trop long
Donc l'idée, c'est d'initialiser une fois l'api, de récupérer son adresse (?) sous forme de long puis de passer cette adresse à toutes mes fonctions
Mais comment, je ne sais pas ce qu'est vers quoi pointer vapi. TotoAPI semble etre une structure...
J'ai essayé de faire ça
1 2 3 4 5 6 7 8 9 10 11 12 13
| void z_init( PA_PluginParameters params )
{
// --- write the code of z_init here...
TotoAPIInvokeInterface vapiii;
TotoAPI *vapi;
TotoAPI_getInvokeInterface( &vapiii, PRODUCTID );
vapiii.TotoAPI_init( &vapi, PRODUCTID );
PA_ReturnLong( params, &vapi );
} |
init de l'api puis passer en retour dans un long l'adresse de vapi
Mais j'ai des warnings à la compile qui me disent
warning: passing argument 2 of 'PA_ReturnLong' makes integer from pointer without a cast
J'aimerais donc sauvegarder l'adresse de l'api, ou sauvegarder un ptr vers cette adresse pour après l'utiliser dans une autre fonction comme par exemple
1 2 3 4 5 6 7 8 9 10 11 12
| void pkg_search_by_name( PA_PluginParameters params )
{
long api;
api = PA_GetLongParameter( params, 1 ); // on recupere l'adresse de vapi
TotoAPIInvokeInterface vapiii;
TotoAPI *vapi;
ICI COMMENT DIRE QUE le pointeur vapi pointe sur l'adresse de l'api que j'ai sauvée pour l'utiliser en dessous ?
TotoAPI_getInvokeInterface( &vapiii, PRODUCTID );
vapiii.TotoAPI_init( &vapi, PRODUCTID ); // --> Comment récupérer un vapi déja existant ? |
J'espere que vous voyez ce que je veux dire...
- Init de l'api dans une fonction
- récupérer son adresse, ou un pointeur vers cette struct
- passer à toutes mes autres fonctions l'adresse ou le ptr pour éviter à avoir à faire un init dans toutes les fonctions
TotoAPIInvokeInterface est une structure qui sert d'interface, il défini toutes les fonctions, de l'api accessibles via un helper
TotoAPI est une structure opaque....
Merci de votre aide
Partager