2011年9月25日日曜日

VisualC++でDLLの作成

DLL作成のための準備
FlashRuntimeExtensions.hFlashRuntimeExtensions.libを用意します。
この2つのファイルは、FlashBuilder4.5インストールディレクトリの中にあります。

FlashRuntimeExtensions.h
例)C:\Program Files\Adobe\Adobe Flash Builder 4.5\sdks\air3.0r1\include

FlashRuntimeExtensions.lib
例)C:\Program Files\Adobe\Adobe Flash Builder 4.5\sdks\air3.0r1\lib\win

DLLの作成
1.Win32プロジェクトを選択後、アプリケーションの種類からDLLを選択します。

2.プロジェクト名は、ANEConnectで作成します。

3.ソリューションエクスプローラより、FlashRuntimeExtensions.hFlashRuntimeExtensions.lib
インクルードします。

4.stdafx.hに#include "FlashRuntimeExtensions.h"をインクルードします。
// stdafx.h : 標準のシステム インクルード ファイルのインクルード ファイル、または
// 参照回数が多く、かつあまり変更されない、プロジェクト専用のインクルード ファイル
// を記述します。
//

#pragma once

#include "targetver.h"

#define WIN32_LEAN_AND_MEAN             // Windows ヘッダーから使用されていない部分を除外します。
// Windows ヘッダー ファイル:
#include <windows.h>

// TODO: プログラムに必要な追加ヘッダーをここで参照してください。
#include "FlashRuntimeExtensions.h"


5.dllmain.cppに処理を記述します。
// dllmain.cpp : DLL アプリケーションのエントリ ポイントを定義します。
#include "stdafx.h"

#include <stdlib.h>
#include <string.h>

extern "C" __declspec(dllexport) void ExtInitializer(
    void** extDataToSet,
    FREContextInitializer* ctxInitializerToSet,
    FREContextFinalizer* ctxFinalizerToSet
);
 
extern "C" __declspec(dllexport) void ExtFinalizer(
    void* extData
);

void ContextInitializer(
    void* extData,
    const uint8_t* ctxType,
    FREContext ctx,
    uint32_t* numFunctionsToTest,
    const FRENamedFunction** functionsToSet
);

void ContextFinalizer(FREContext ctx);

FREObject getParameter(
    FREContext ctx,
    void* funcData,
    uint32_t argc,
    FREObject argv[]
);

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
      )
{
 switch (ul_reason_for_call)
 {
 case DLL_PROCESS_ATTACH:
 case DLL_THREAD_ATTACH:
 case DLL_THREAD_DETACH:
 case DLL_PROCESS_DETACH:
  break;
 }
 return TRUE;
}

__declspec(dllexport) void ExtInitializer(
    void** extDataToSet,
    FREContextInitializer* ctxInitializerToSet,
    FREContextFinalizer* ctxFinalizerToSet
) {
    *extDataToSet = NULL;
    *ctxInitializerToSet = &ContextInitializer;
    *ctxFinalizerToSet = &ContextFinalizer;
}

__declspec(dllexport) void ExtFinalizer(void* extData) {
    return;
}

void ContextInitializer(
    void* extData,
    const uint8_t* ctxType,
    FREContext ctx,
    uint32_t* numFunctionsToTest,
    const FRENamedFunction** functionsToSet
) {
    *numFunctionsToTest = 1;
 
    FRENamedFunction* func =
       (FRENamedFunction*)malloc(sizeof(FRENamedFunction)*1); 
 
    func[0].name = (const uint8_t*)"getParameter";
    func[0].functionData = NULL;
    func[0].function = &getParameter;
 
    *functionsToSet = func;
}

void ContextFinalizer(FREContext ctx) {
 return;
}

FREObject getParameter(
    FREContext ctx,
    void* funcData,
    uint32_t argc,
    FREObject argv[]
) {
 FREObject retObj;
 FREResult result;
 uint32_t len;
 const uint8_t* message;
 char sendMessage[128] = "ANEConnect from ";

 len = strlen((const char*)argv[0])+1;
 result = FREGetObjectAsUTF8(argv[0],&len,&message);
 
 strcat_s(sendMessage,128,(const char*)message);

 FRENewObjectFromUTF8(128,(const uint8_t*)sendMessage,&retObj);

 return retObj;
}

6.ソリューションのビルドを行い、ANEConnect.dllを作成します。

2 件のコメント:

  1. How i can use unicode string with FRENewObjectFromUTF8(128,(const uint8_t*)sendMessage,&retObj);

    Regards.

    返信削除
  2. There are no "FRENewObjectFromUnicode"

    After the conversion to UTF-8 UNICODE, FRENewObjectFromUTF8 How do you use to?

    返信削除