static int BindFUNC( STRUCTDAT *st, char *name ) { // ファンクションのバインドを行なう // (name:後から与える時のファンクション名) // int i; char *n; LIBDAT *lib; HINSTANCE hd; if (( st->subid != STRUCTPRM_SUBID_DLL )&&( st->subid != STRUCTPRM_SUBID_OLDDLL )) return 4; i = st->nameidx; if ( i < 0 ) { if ( name == NULL ) return 3; n = name; } else { n = strp(i); } lib = GetLIB( st->index ); if ( lib->flag != LIBDAT_FLAG_DLLINIT ) { BindLIB( lib, NULL ); if ( lib->flag != LIBDAT_FLAG_DLLINIT ) return 2; } hd = (HINSTANCE)(lib->hlib); if ( hd == NULL ) return 1; #ifdef HSPUTF8 HSPAPICHAR *hactmp1; char tmp1[512]; chartoapichar(n,&hactmp1); cnvsjis(tmp1,(char*)hactmp1,512); st->proc = (void *)GetProcAddress( hd, tmp1 ); freehac(&hactmp1); #else st->proc = (void *)GetProcAddress( hd, n ); #endif if ( st->proc == NULL ) return 1; st->subid--; return 0; }
static int Hsp3ExtAddPlugin( void ) { // プラグインの登録 // int i; HSPHED *hed; char *ptr; char *libname; char *funcname; HPIDAT *org_hpi; MEM_HPIDAT *hpi; HSP3TYPEINFO *info; HINSTANCE hd; TCHAR tmp[512]; hed = hspctx->hsphed; ptr = (char *)hed; org_hpi = (HPIDAT *)(ptr + hed->pt_hpidat); hpimax = hed->max_hpi / sizeof(HPIDAT); if ( hpimax == 0 ) return 0; hpidat = (MEM_HPIDAT *)malloc(hpimax * sizeof(MEM_HPIDAT)); hpi = hpidat; for ( i=0;i<hpimax;i++ ) { hpi->flag = org_hpi->flag; hpi->option = org_hpi->option; hpi->libname = org_hpi->libname; hpi->funcname = org_hpi->funcname; hpi->libptr = NULL; libname = strp(hpi->libname); funcname = strp(hpi->funcname); info = code_gettypeinfo(-1); if ( hpi->flag == HPIDAT_FLAG_TYPEFUNC ) { hd = DllManager().load_library( libname ); if ( hd == NULL ) { #ifdef HSPUTF8 TCHAR tmp[512]; HSPAPICHAR *haclibname; chartoapichar(libname, &haclibname); _stprintf(tmp, TEXT("No DLL:%s"), haclibname); freehac(&haclibname); AlertW(tmp); #else Alertf( "No DLL:%s", libname ); #endif return 1; } hpi->libptr = (void *)hd; #ifdef HSPUTF8 HSPAPICHAR *hacfuncname; char tmp2[512]; chartoapichar(funcname,&hacfuncname); cnvsjis(tmp2,(char*)hacfuncname,512); func = (DLLFUNC)GetProcAddress( hd, tmp2 ); #else func = (DLLFUNC)GetProcAddress( hd, funcname ); #endif if ( func == NULL ) { #ifdef HSPUTF8 TCHAR tmp[512]; HSPAPICHAR *haclibname; chartoapichar(libname, &haclibname); _stprintf(tmp, TEXT("No DLL:%s:%s"), haclibname, hacfuncname); freehac(&haclibname); AlertW(tmp); freehac(&hacfuncname); #else Alertf("No DLL:%s:%s", libname, funcname); #endif return 1; } func( info ); code_enable_typeinfo( info ); //Alertf( "%d_%d [%s][%s]", i, info->type, libname, funcname ); #ifdef HSPUTF8 freehac(&hacfuncname); #endif } hpi++; org_hpi++; } return 0; }
static void *reffunc_ctrlfunc( int *type_res, int arg ) { // reffunc : TYPE_DLLCTRL // (拡張DLLコントロール関数) // void *ptr; int p1,p2; // '('で始まるかを調べる // if ( *type != TYPE_MARK ) throw ( HSPERR_INVALID_FUNCPARAM ); if ( *val != '(' ) throw ( HSPERR_INVALID_FUNCPARAM ); code_next(); ptr = &reffunc_intfunc_ivalue; *type_res = HSPVAR_FLAG_INT; switch( arg ) { // サブコマンドごとの分岐 case 0x100: // callfunc { PVal *pval; PDAT *p; pval = code_getpval(); p = HspVarCorePtrAPTR( pval, 0 ); p1 = code_geti(); p2 = code_geti(); reffunc_intfunc_ivalue = call_extfunc( (void *)p1, (int *)p, p2 ); break; } case 0x101: // cnvwtos { PVal *pval; char *sptr; int size; sptr = code_getvptr( &pval, &size ); hspctx->stmp = sbExpand( hspctx->stmp, size ); ptr = hspctx->stmp; cnvsjis( ptr, sptr, size ); *type_res = HSPVAR_FLAG_STR; break; } case 0x102: // comevdisp #ifdef HSP_COM_UNSUPPORTED throw ( HSPERR_UNSUPPORTED_FUNCTION ); #else { PVal *pval; APTR aptr; IUnknown **ppunk; // 第1パラメータ:COMオブジェクト変数 aptr = code_getva( &pval ); if ( pval->flag != TYPE_COMOBJ ) throw ( HSPERR_TYPE_MISMATCH ); ppunk = (IUnknown **)HspVarCorePtrAPTR( pval, aptr ); if ( !IsVaridComPtr(ppunk) ) throw ( HSPERR_COMDLL_ERROR ); // イベントの DISPID 取得 reffunc_intfunc_ivalue = GetEventDispID( *ppunk ); break; } #endif // HSP_COM_UNSUPPORTED case 0x103: // libptr { //LIBDAT *lib; STRUCTDAT *st; switch( *type ) { case TYPE_DLLFUNC: case TYPE_MODCMD: p1 = *val; break; case TYPE_DLLCTRL: p1 = *val; if ( p1 >= TYPE_OFFSET_COMOBJ ) { p1 -= TYPE_OFFSET_COMOBJ; break; } default: throw ( HSPERR_TYPE_MISMATCH ); } code_next(); st = GetPRM( p1 ); //lib = &hspctx->mem_linfo[ st->index ]; reffunc_intfunc_ivalue = (int)st; break; } default: throw ( HSPERR_SYNTAX ); } // ')'で終わるかを調べる // if ( *type != TYPE_MARK ) throw ( HSPERR_INVALID_FUNCPARAM ); if ( *val != ')' ) throw ( HSPERR_INVALID_FUNCPARAM ); code_next(); return ptr; }
void *comget_variant( VARIANT *var, int *restype, BOOL fvariantret /* = FALSE*/ ) { // VARIANT型→HSPの型に変換する // int size; BSTR bstr; /* rev 43 mingw : warning : 定数へのポインタを非定数へのポインタに代入 に対処 */ void const *ptr; if ( fvariantret ) { VariantCopy( &comconv_var, var ); *restype = HSPVAR_FLAG_VARIANT; return &comconv_var; } VariantCopyInd( &comconv_var, var ); switch ( comconv_var.vt ) { case VT_R4: VariantChangeType( &comconv_var, &comconv_var, VARIANT_NOVALUEPROP, VT_R8 ); case VT_R8: *restype = HSPVAR_FLAG_DOUBLE; return &comconv_var.dblVal; case VT_BSTR: // 文字列全体を返すため、ANSI文字列をバイナリデータBSTRとして格納 ptr = comconv_var.bstrVal; if ( ptr == NULL ) ptr = L""; size = cnvsjis( NULL, (char *)ptr, 0 ); bstr = SysAllocStringByteLen( NULL, size ); if ( bstr == NULL ) throw HSPERR_OUT_OF_MEMORY; cnvsjis( (char *)bstr, (char *)ptr, size ); SysFreeString( comconv_var.bstrVal ); comconv_var.bstrVal = bstr; *restype = HSPVAR_FLAG_STR; return comconv_var.bstrVal; case VT_DISPATCH: case VT_UNKNOWN: *restype = HSPVAR_FLAG_COMSTRUCT; return &comconv_var.punkVal; case VT_I2: case VT_UI2: case VT_I1: case VT_UI1: case VT_I8: case VT_UI8: case VT_BOOL: VariantChangeType( &comconv_var, &comconv_var, VARIANT_NOVALUEPROP, VT_I4 ); case VT_I4: case VT_UI4: case VT_ERROR: case VT_INT: case VT_UINT: *restype = HSPVAR_FLAG_INT; return &comconv_var.lVal; default: if ( comconv_var.vt & VT_ARRAY ) { *restype = HSPVAR_FLAG_VARIANT; // SafeArray は Variant 型変数で扱う return &comconv_var; } throw HSPERR_INVALID_TYPE; } }