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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 à
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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