Pass callback to application from pb dll

Just starting out? Need help? Post your questions and find answers here.
kemsky_by
User
User
Posts: 14
Joined: Sun Jul 24, 2011 9:35 pm

Pass callback to application from pb dll

Post by kemsky_by »

Hi,
I'm trying to use PB to create extension for Adobe Air (it's a dll),
i've already created similar extensions using C language, but run into issues with PB.

The problem is that functions (contextInitializer and contextFinilizer) passed to runtime are never called

FlashRuntimeExtensions.h

First, working C version (simplified):

Code: Select all

       //only these 2 functions must be exported
       __declspec(dllexport) void initializer(void** extData, FREContextInitializer* ctxInitializer, FREContextFinalizer* ctxFinalizer);
       __declspec(dllexport) void finalizer(void* extData);

        void contextInitializer(void* extData, const uint8_t* ctxType, FREContext ctx, uint32_t* numFunctions, const FRENamedFunction** functions)
        {
            *numFunctions = 0;
        }

        void contextFinalizer(FREContext ctx)
        {
        }

        void initializer(void** extData, FREContextInitializer* ctxInitializer, FREContextFinalizer* ctxFinalizer)
        {
            //these 2 functions are successfully called when extension is initialized
            *ctxInitializer = &contextInitializer;
            *ctxFinalizer = &contextFinalizer;
        }

        void finalizer(void* extData)
        {
        }
PB version:

Code: Select all

ProcedureDLL contextInitializer(*extData, *ctxType.s, *ctx, *numFunctions.u, *functions)
   numFunctions.u = 0;
EndProcedure 

ProcedureDLL contextFinalizer(*ctx)
EndProcedure 

ProcedureCDLL initializer(*extData, *ctxInitializer, *ctxFinalizer)
  //these 2 functions are never called :(
  ctxInitializer = @contextInitializer()
  ctxFinalizer = @contextFinalizer()
EndProcedure 

ProcedureCDLL finalizer(*extData)
EndProcedure 
Thanks in advance
User avatar
Danilo
Addict
Addict
Posts: 3036
Joined: Sat Apr 26, 2003 8:26 am
Location: Planet Earth

Re: Pass callback to application from pb dll

Post by Danilo »

What are data types FREContextInitializer and FREContextFinalizer? Integer?

If it is a pointer size type, the following should work:

Code: Select all

EnableExplicit

ProcedureDLL contextInitializer(*extData, *ctxType.Ascii, *ctx, *numFunctions.Unicode, *functions)
   *numFunctions\u = 0
EndProcedure

ProcedureDLL contextFinalizer(*ctx)
EndProcedure

ProcedureCDLL initializer(*extData, *ctxInitializer.Integer, *ctxFinalizer.Integer)
  ;//these 2 functions are never called :(
  *ctxInitializer\i = @contextInitializer()
  *ctxFinalizer\i   = @contextFinalizer()
EndProcedure

ProcedureCDLL finalizer(*extData)
EndProcedure 
kemsky_by
User
User
Posts: 14
Joined: Sun Jul 24, 2011 9:35 pm

Re: Pass callback to application from pb dll

Post by kemsky_by »

thanks, finally i've made it work, but PB is still very confusing to me.

Code: Select all

ProcedureCDLL initializer(extData.l, *ctxInitializer.Long, *ctxFinalizer.Long)
  *ctxInitializer\l = @contextInitializer()
  *ctxFinalizer\l = @contextFinalizer()
EndProcedure
Post Reply