【C++】AS3資料型態轉換

21 6月, 2018

【C++】AS3資料型態轉換






之前專案在做C++對接AS3的時候,
對雙方資料交換處理上有弄成一個類方便來使用


AneDataConvert.h
/**
Theme: FlashNative
Compiler: Microsoft Visual Studio 2012 Express
Date: 2017/11/10
Author: LeesonHsu
Email:leesonhsu@arplanet.com.tw
Blog: www.arplanet.com.tw
*/
#include "ExtensionAneConfig.h"
#ifndef DATACONVERT_H
#define DATACONVERT_H
class AneDataConvert
{
public:
// c++ to as3
static FREObject AsBool(int32_t vaule);
static FREObject AsInt(int32_t vaule);
static FREObject AsUint(unsigned int i);
static FREObject AsDouble(double vaule);
static FREObject AsUTF8_WCHAR(const wchar_t* str);
static FREObject AsUTF8(const char* str);
static FREObject AsUTF8(wchar_t * str);
static FREObject AsPoint(double x,double y);
static FREObject AsVector3D(double x,double y,double z);
// as3 to c++
static bool ToBool(FREObject freObject);
static int ToInt(FREObject freObject);
static unsigned int ToUint(FREObject freObject);
static double ToDouble(FREObject freObject);
static const char* ToUTF8(FREObject freObject);
static const wchar_t * ToUTF8_LCPW(FREObject freObject);
//c++ send event to as3
static void dispatchEvent(FREContext ctx, const uint8_t* state, const uint8_t* evt);
};
#endif


AneDataConvert.cpp
/**
Theme: FlashNative
Compiler: Microsoft Visual Studio 2012 Express
Date: 2017/11/10
Author: LeesonHsu
Email:leesonhsu@arplanet.com.tw
Blog: www.arplanet.com.tw
*/
#include "AneDataConvert.h"
//[c++ to as3] 型態轉換 bool
FREObject AneDataConvert::AsBool(int32_t vaule)
{
FREObject obj;
FRENewObjectFromBool((vaule) ? 1 : 0, &obj);
return obj;
}
//[c++ to as3] 型態轉換 int
FREObject AneDataConvert::AsInt(int32_t vaule)
{
FREObject obj;
FRENewObjectFromInt32(vaule, &obj);
return obj;
}
//[c++ to as3] 型態轉換 uint
FREObject AneDataConvert::AsUint(unsigned int vaule)
{
FREObject obj;
FRENewObjectFromUint32(vaule, &obj);
return obj;
}
//[c++ to as3] 型態轉換 double
FREObject AneDataConvert::AsDouble(double vaule)
{
FREObject obj;
FRENewObjectFromDouble(vaule, &obj);
return obj;
}
//[c++ to as3] char 型態轉換 string
FREObject AneDataConvert::AsUTF8(const char* str)
{
FREObject obj;
FRENewObjectFromUTF8( strlen( str ) + 1, (const uint8_t*) str, &obj );
return obj;
}
//[c++ to as3] wcahr 型態轉換 string
FREObject AneDataConvert::AsUTF8_WCHAR(const wchar_t* wstr)
{
//將wchar轉char
_bstr_t cStr(wstr);
const char* str = cStr;
return AsUTF8(str);
}
//[c++ to as3] 型態轉換 point
FREObject AneDataConvert::AsPoint(double x,double y)
{
FREObject point;
FREObject freX, freY;
FRENewObjectFromDouble(x, &freX);
FRENewObjectFromDouble(y, &freY);
FREObject pointParams[] = {freX, freY};
FRENewObject( (const uint8_t*) "flash.geom.Point", 2, pointParams, &point, NULL);
return point;
}
//[as3 to c++] 型態轉換 bool
bool AneDataConvert::ToBool(FREObject freObject)
{
unsigned int value;
FREGetObjectAsBool(freObject, &value);
return (value != 0);
}
//[as3 to c++] 型態轉換 int
int AneDataConvert::ToInt(FREObject freObject)
{
int value;
FREGetObjectAsInt32(freObject,&value);
return value;
}
//[as3 to c++] 型態轉換 uint
unsigned int AneDataConvert::ToUint(FREObject freObject)
{
unsigned int value;
FREGetObjectAsUint32(freObject, &value);
return value;
}
//[as3 to c++] 型態轉換 double
double AneDataConvert::ToDouble(FREObject freObject)
{
double value;
FREGetObjectAsDouble(freObject, &value);
return value;
}
//[as3 to c++] 型態轉換 char*
const char* AneDataConvert::ToUTF8(FREObject freObject)
{
uint32_t len;
const uint8_t* str;
FREGetObjectAsUTF8(freObject, &len, &str );
return (const char*)str;
}
//[as3 to c++] 型態轉換 wchar_t*
const wchar_t* AneDataConvert::ToUTF8_LCPW(FREObject freObject)
{
uint32_t len;
const uint8_t* str;
wchar_t wBuffer[1024];
FREGetObjectAsUTF8(freObject, &len, &str );
MultiByteToWideChar( CP_UTF8, 0, (const char*)str, -1, wBuffer, 1024);
return wBuffer;
}
//[c++ to as3] event
void AneDataConvert::dispatchEvent(FREContext ctx,const uint8_t* state,const uint8_t* evt)
{
FREDispatchStatusEventAsync(ctx, state, evt);
}
用法如下:
//查找窗口名稱,強制關閉窗口
FREObject NativeAneManager::closeWindow(FREObject windowname)
{
bool isHasHwd = false;
//取得窗口
HWND hwd = FindWindow( NULL, AneDataConvert::ToUTF8_LCPW(windowname)); //window Name
if(hwd)
{
SendMessage(hwd, WM_SYSCOMMAND, SC_CLOSE, 0);
isHasHwd=true;
}
return AneDataConvert::AsBool(isHasHwd);
}
view raw test.cpp hosted with ❤ by GitHub

張貼留言