рдпрд╣рд╛рдВ
рдкреНрдпреЛрд░рдмреЗрд╕рд┐рдХ рдХреА рдмрдврд╝рддреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдХреЗ
рдорджреНрджреЗрдирдЬрд░ , рдореИрдВ рдЗрд╕ рднрд╛рд╖рд╛ рдХреЗ рдЖрд╡реЗрджрди рдХреЗ рдПрдХ рдЕрдиреНрдп рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВред
рд╡рд╛рдпреБ рдХреЗ рддреАрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░, рдПрдХреНрд╕рдЯреЗрдВрд╢рди (рдлреНрд▓реИрд╢ рд░рдирдЯрд╛рдЗрдо рдПрдХреНрд╕рдЯреЗрдВрд╢рди) рдХреЗ рдХрд╛рд░рдг рд╕реАрдорд┐рдд рдПрд╕рдбреАрдХреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╖рддрд┐рдкреВрд░реНрддрд┐
рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛ред рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ C / C ++ / Java (Android) рдФрд░ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рд▓рд┐рдП рджреЗрд╢реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдХрдореНрдкреНрдпреВрдЯрд┐рдВрдЧ рдЧрддрд┐, рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ, рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд - рдпрд╣ рд╕рдм рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИред рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рдореИрдВрдиреЗ рдореИрдХ рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП рд╕реА рдореЗрдВ рдПрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд▓рд┐рдЦрд╛ рдерд╛ -
HIDAPI рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдгред рдХреБрдЫ рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рд╕реБрд╡рд┐рдзрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкреНрд░рдХреГрддрд┐ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ, рдЬрд┐рд╕рдиреЗ рдПрдХ рдмрд╛рд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдФрд░ рдиреНрдпреВрдирддрдо рдкреНрд░рдпрд╛рд╕ рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛ рджрд┐рдпрд╛ред
PureBasic, рдмрджрд▓реЗ рдореЗрдВ, рдХрдИ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди (dll, рдЗрд╕рд▓рд┐рдП,
рдбреНрд░рд╛рдЗрд╡рд░ ) рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЕрдиреБрдХреВрд▓рди рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдпреВрдирд┐рдХреЛрдб рд╕рдорд░реНрдерди, рд░реЗрдбреА-рдореЗрдб рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ (рд╕реВрдЪреА, рдорд╛рдирдЪрд┐рддреНрд░), рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдлрд╝рдВрдХреНрд╢рдВрд╕ (рд╕рдВрдкреАрдбрд╝рди, рдЫрд╡рд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг, рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рджрдо) рдХрд╛ рдПрдХ рд╕реЗрдЯ, рдЕрдзрд┐рдХрд╛рдВрд╢ WinAPI, рдореИрдХреНрд░реЛрдЬрд╝ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ OOP рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рддрд╣рдд рдЖрдпрд╛рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╣ рд╕рдм рдХрд╛рдлреА рд╡рд┐рдХрд╛рд╕ рдХреЛ рдЧрддрд┐ рджреЗрддрд╛ рд╣реИ (рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рд╕реА / рд╕реА ++ рдЕрдиреБрднрд╡ рдирд╣реАрдВ рд╣реИ), рдирдВрдЧреЗ рд╕реА рдХреА рддреБрд▓рдирд╛ рдореЗрдВред
рдЙрджрд╛рд╣рд░рдг - рд╕рд┐рд╕реНрдЯрдо рдореЛрдбрд▓ рдбрд╛рдпрд▓реЙрдЧ
рд╕реНрд░реЛрдд рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП рдПрдХ рдбреЗрдореЛ рдПрдкреНрд▓реАрдХреЗрд╢рди
code.google.com рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред
рдкрд╣рд▓рд╛ рдХрджрдо FlashRuntimeExtensions.lib рд▓рд╛рдЗрдмреНрд░реЗрд░реА (рд╡рд┐рдВрдбреЛрдЬрд╝, {AIR SDK} \ lib \ win \) рд╕реЗ рдлрд╝рдВрдХреНрд╢рдВрд╕
рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдерд╛, рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рд╣реИ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ FlashRuntimeExtensions.h ({AIR SDK \ "рд╢рд╛рдорд┐рд▓ рд╣реИрдВ):
ImportC "../lib/FlashRuntimeExtensions.lib" ;returns FRE_OK ; FRE_WRONG_THREAD ; FRE_INVALID_ARGUMENT If nativeData is null. ;FREResult FREGetContextNativeData( FREContext ctx, void** nativeData ); ;-FREGetContextNativeData FREGetContextNativeData.l (ctx.l, nativeData.l) ... EndImport
рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ, рдЖрдкрдХреЛ рд╕рд╛рдЭрд╛ рдбреАрдПрд▓рдПрд▓ рдкреНрд░рд╛рд░реВрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдпреВрдирд┐рдХреЛрдб рд╕рдорд░реНрдерди рд╕рдХреНрд╖рдо рдХрд░реЗрдВ (+ рдлрд╝рд╛рдЗрд▓ / рдкреНрд░рд╛рд░реВрдк рдореЗрдиреВ рдореЗрдВ UTF8 рд╕реНрд░реЛрдд рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ), рдереНрд░реЗрдб рд╕реБрд░рдХреНрд╖рд╛ рдпрд╛ рдЕрд╕реЗрдВрдмрд▓реА рд╕рдорд░реНрдердиред
рдХреЗрд╡рд▓ рдЕрд╕реБрд╡рд┐рдзрд╛ PureBasic рдореЗрдВ рдПрдХ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд▓рдВрдмреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдХрдореА рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдирд╛ рдкрдбрд╝рд╛ред
рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдореЗрдВ, рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо, рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ 2 рд╕рд┐рдВрдЧрд▓ рдПрдХреНрд╕рдкреЛрд░реНрдЯреЗрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ (рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдФрд░ рдлрд╛рдЗрдирд▓) рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ:
<?xml version="1.0" encoding="UTF-8"?> <extension xmlns="http://ns.adobe.com/air/extension/3.1"> <id>com.pure.Extension</id> <name>pureair</name> <copyright>compile4fun 2012</copyright> <description>Extenion for Adobe AIR</description> <versionNumber>1.0.0</versionNumber> <platforms> <platform name="Windows-x86"> <applicationDeployment> <nativeLibrary>pureair.dll</nativeLibrary> <initializer>initializer</initializer> <finalizer>finalizer</finalizer> </applicationDeployment> </platform> </platforms> </extension>
рдЖрдИрдбреА рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдирд┐рдлрд╝реЗрд╕реНрдЯ рдФрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдкреИрдХреЗрдЬ (рдПрдХреНрд╢рдирд╕реНрдХреНрд░рд┐рдкреНрдЯ) рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЖрд╡реЗрджрди рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╣рд┐рд╕реНрд╕рд╛ рдЕрдЯреИрдЪрдкреНрд░реЛрд╕реЗрд╕ (рдЗрдВрд╕реНрдЯреЗрдВрд╕), рдбрд┐рдЯреИрдЪрдкреНрд░реЛрд╕реЗрд╕ (рдЗрдВрд╕реНрдЯреЗрдВрд╕), рдЕрдЯреИрдЪрдереНрд░реЗрдб (рдЗрдВрд╕реНрдЯреЗрдВрд╕) рдФрд░ рдбрд┐рдЯреИрдЪрд╣реНрд░реЗрдб (рдЗрдВрд╕реНрдЯреЗрдВрд╕) рдХрд╛рд░реНрдп рд╣реИ, рд╕рд╛рде рд╣реА:
... ;CDecl ProcedureC contextInitializer(extData.l, ctxType.s, ctx.l, *numFunctions.Long, *functions.Long) *log\info("create context: " + Str(ctx) + "=" + Utf8ToUnicode(ctxType)) Define result.l ;exported extension functions count: Define size.l = 1 ;Array of FRENamedFunction: Dim f.FRENamedFunction(size - 1) ;there is no unsigned long type in PB setULong(*numFunctions, size) ;If you want to return a string out of a DLL, the string has to be declared as Global before using it. ;method name f(0)\name = asGlobal("showDialog") ;function data example f(0)\functionData = asGlobal("showDialog") ;function pointer f(0)\function = @showDialog() *functions\l = @f() ;some additional data can be stored extData = #Null ;native data example result = FRESetContextNativeData(ctx, asGlobal("FRESetContextNativeData")) *log\Debug(ResultDescription(result, "FRESetContextNativeData")) *log\info("create context complete"); EndProcedure ;CDecl ProcedureC contextFinalizer(ctx.l) *log\info("dispose context: " + Str(ctx)) EndProcedure ;CDecl ProcedureCDLL initializer(extData.l, *ctxInitializer.Long, *ctxFinalizer.Long) *ctxInitializer\l = @contextInitializer() *ctxFinalizer\l = @contextFinalizer() EndProcedure ;CDecl ;this method is never called on Windows... ProcedureCDLL finalizer(extData.l) ;do nothing EndProcedure
FRENamedFunction рд╕рд░рдгреА рдореЗрдВ рд╣рдорд╛рд░реЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рддрд░реАрдХреЗ рд╣реИрдВ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЗрд╡рд▓ рдПрдХ - showDialog), рдпрд╣ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛ рдХреЛ рдмрд╛рдВрдзрдирд╛ рд╕рдВрднрд╡ рд╣реИред рдЖрдкрдХреЛ CDecl рдХреЙрд▓ рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ AsGlobal рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдП рдЧрдП рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдпрд╣ PureBasic dll рдорджрдж рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╣реИред
рд╣рдорд╛рд░рд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдмрдЯрди рдФрд░ рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рдПрдХ рдордирдорд╛рдиреЗ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдореЛрдбрд▓ рдбрд╛рдпрд▓реЙрдЧ рджрд┐рдЦрд╛рдПрдЧрд╛ рдФрд░ рдПрдХ рдбрд╛рдпрд▓реЙрдЧ рдХреНрд▓реЛрдЬрд┐рдВрдЧ рдЗрд╡реЗрдВрдЯ рднреЗрдЬреЗрдЧрд╛:
Structure MessageParameters text.s title.s dwFlags.l ctx.l EndStructure Procedure ModalMessage(*params.MessageParameters) Define result.l, code.l code = MessageRequester(*params\title, *params\text, *params\dwFlags) result = FREDispatchStatusEventAsync(*params\ctx, asGlobal("showDialog"), asGlobal(Str(code))) *log\Debug (ResultDescription(result, "FREDispatchStatusEventAsync")) EndProcedure ;CDecl ProcedureC.l showDialog(ctx.l, funcData.l, argc.l, *argv.FREObjectArray) *log\info("Invoked showDialog") Define result.l ;ActionScriptData example Define actionScriptObject.l, actionScriptInt.l, type.l result = FREGetContextActionScriptData(ctx, @actionScriptObject) *log\Debug(ResultDescription(result, "FREGetContextActionScriptData")) result = FREGetObjectType(actionScriptObject, @type) *log\Debug("result=" + ResultDescription(result, "FREGetObjectType")) *log\info("ContextActionScriptData: type=" + TypeDescription(type)) result = FREGetObjectAsInt32(actionScriptObject, @actionScriptInt) *log\Debug("result=" + ResultDescription(result, "FREGetObjectAsInt32")) *log\info("ContextActionScriptData: actionScriptInt=" + Str(actionScriptInt)) ;function data example Define funcDataS.s funcDataS = PeekS(funcData, -1, #PB_Ascii) *log\info("FunctionData: " + funcDataS) *log\info("Method args size: " + Str(fromULong(argc))) Define resultObject.l, length.l, booleanArg.l, dwFlags.l, message.s, *string.Ascii result = FREGetObjectAsBool(*argv\object[0], @booleanArg) *log\Debug("result=" + ResultDescription(result, "FREGetObjectAsBool")) result = FREGetObjectAsInt32(*argv\object[1], @dwFlags) *log\Debug("result=" + ResultDescription(result, "FREGetObjectAsInt32")) result = FREGetObjectAsUTF8(*argv\object[2], @length, @*string) *log\Debug("result=" + ResultDescription(result, "FREGetObjectAsUTF8")) message = PeekS(*string, fromULong(length) + 1) *log\info("Argument: booleanArg=" + Str(fromULong(booleanArg))) *log\info("Argument: dwFlags=" + Str(dwFlags)) *log\info("Argument: message=" + Utf8ToUnicode(message)) ;native data example Define native.l, nativeData.s result = FREGetContextNativeData(ctx, @native) *log\Debug(ResultDescription(result, "FREGetContextNativeData")) nativeData = PeekS(native, -1, #PB_Ascii) *log\info("FREGetContextNativeData: " + nativeData) Define *params.MessageParameters = AllocateMemory(SizeOf(MessageParameters)) *params\ctx = ctx *params\title = "PureBasic" *params\text = Utf8ToUnicode(message) *params\dwFlags = dwFlags CreateThread(@ModalMessage(), *params) ;return Boolean.TRUE result = FRENewObjectFromBool(toULong(1), @resultObject) *log\Debug(ResultDescription(result, "FRENewObjectFromBool")) ProcedureReturn resultObject EndProcedure
рдПрдпрд░ рдХреА рддрд░рдл, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
package com.pure { import flash.events.StatusEvent; import flash.external.ExtensionContext; import mx.logging.ILogger; import mx.logging.Log; public class Extension { public static const CONTEXT:String = "com.pure.Extension"; private static const log:ILogger = Log.getLogger(CONTEXT); private var _context:ExtensionContext; private var contextType:String; public function Extension(contextType:String = "PureAir", actionScriptData:int = 4) {
StatusEvent рдПрдХрдорд╛рддреНрд░ рдкреНрд░рдХрд╛рд░ рдХреА рдШрдЯрдирд╛ рд╣реИ рдЬрд┐рд╕реЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИред
рдХрд╛рд░реНрдп рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред