发布于 2014-03-12 15:26:00
2楼
可能用到的C++函数为:
unsigned int _mbctombb( unsigned int c );
将双字节多字节字符转换为相应的单字节多字节字符。
需要#include
ANSI转为UNICODE的dll函数源代码:
#include
#define LOCNAME "chinese-simplified"
#define BUF_SIZE 256
#include
//------------------------------------------------------------------------------
static FunctionListRec fnList[] =
{
// TODO add for every new function an entry
/*{ INTEGER_VAR, "add", "(int a, int b, int &sum)", false },*/
{ INTEGER_VAR, "ANSI_Unicode", "(string ANSI_Src,blob &Unicode_Des)", true }
};
CTRL_EXTENSION(convertExternHdl, fnList)
//------------------------------------------------------------------------------
const Variable *convertExternHdl::execute(ExecuteParamRec ¶m)
{
enum
{
// TODO add here all your function numbers in the sequence used in the FunctionListRec array
F_cvt = 0
};
// TODO for the different return types you need corresponding static Variables
static IntegerVar integerVar;
static BlobVar blobVar;
switch ( param.funcNum )
{
// ---------------------------------------------------------------------
case F_cvt:
{
param.thread->clearLastError();
if ( !param.args (param.args->getNumberOfItems() != 2) )
{
ErrClass err(ErrClass::PRIO_WARNING,
ErrClass::ERR_CONTROL, ErrClass::ARG_MISSING,
param.thread->getLocation(), param.funcName);
ErrHdl::error(err);
param.thread->appendLastError(err);
integerVar.setValue(-1); return &integerVar;
}
TextVar textVar;
textVar = *(param.args->getFirst()->evaluate(param.thread));
Variable *des = param.args->getNext()->getTarget(param.thread);
if ( ! des )
{
ErrClass err(ErrClass::PRIO_WARNING,
ErrClass::ERR_CONTROL, ErrClass::NO_LVALUE,
param.thread->getLocation(), param.funcName);
ErrHdl::error(err);
param.thread->appendLastError(err);
integerVar.setValue(-1); return &integerVar;
}
if (setlocale(LC_ALL,LOCNAME) == NULL)
{
ErrClass err(ErrClass::PRIO_WARNING,
ErrClass::ERR_CONTROL, ErrClass::ERR_CONTROL,
param.thread->getLocation(), param.funcName);
ErrHdl::error(err);
param.thread->appendLastError(err);
integerVar.setValue(-1); return &integerVar;
}
size_t length=0;
mbstate_t *ptMbstate_t =0;
const char *strOriginal = textVar.getString();
length = mbsrtowcs(NULL,&strOriginal,0,ptMbstate_t);
wchar_t buffer[BUF_SIZE];
for(int i=0;i< BUF_SIZE; i++)
{
buffer[i]=(wchar_t)0x0000;
}
mbsrtowcs(buffer,&strOriginal,length,ptMbstate_t);
PVSSuchar *data;
data = (PVSSuchar*)buffer;
BlobVar blobVar(data,(PVSSulong)length*2,true);
// relase system resource
ptMbstate_t = NULL;
strOriginal = NULL;
data = NULL;
*des = blobVar;
integerVar.setValue(0);
return &integerVar;
}
// ---------------------------------------------------------------------
default:
{ integerVar.setValue(-1);}
//After switch ......
////////
return &integerVar;
}
}
参考:
http://msdn.microsoft.com/zh-cn/library/0heszx3w.aspx
http://msdn.microsoft.com/zh-cn/library/6e348b4x.aspx
喵了个咪的再汪打你