
ãã®èšäºã§ã¯ãMathcadæ°åŠããã±ãŒãžãäŸãšããŠäœ¿çšããŠãã¢ã³ãããŒãžã³ãŒããšãããŒãžã³ãŒãã®éã«ããªããžãæ§ç¯ããæ¹æ³ã«ã€ããŠèª¬æããŸãã åçã¯ãChipmunk Totãæ°åŠããã±ãŒãžããŒã«ã䜿çšããŠç»åãåŠçããæ¹æ³ã®äŸã瀺ããŠããŸãã ãããè¡ãããã«ã圌ã¯VB.Netã§èšè¿°ãããã«ã¹ã¿ã é¢æ°ãã䜿çšãããŸãããããã¯ãWebã«ã¡ã©ã«æ¥ç¶ããŠç»åãäœæããæ©èœãå®è£ ããŠããŸãã é¢æ°ã®çµæã¯ãäœæ¥äžã®ããã¥ã¡ã³ãã§ããã«å©çšã§ããŸãã
ãœãŒã¹ã³ãŒã
äžåºŠã«ãã¹ãŠãç解ããã³ãŒããæãã«å®è¡ãããçæ°ãªäººã®ããã«ããªããžããªNetEFIã瀺ããŸãã ãã¹ããŠãŒã¶ãŒã©ã€ãã©ãªã¯ãcïŒãvb.netãc ++ / cliïŒVS2012ã.Net 2.0ãx86-32ïŒã®3ã€ã®èšèªã§èŠã€ããããšãã§ããŸãã ãããŸã§ã®ãšããã32ãããã®å®è£ ã®ã¿ãå©çšå¯èœã§ãã
èæ¯
æ°åŠããã°ã©ã Mathcadã«ã¯ããµãŒãããŒãã£ã®ã©ã€ãã©ãªãæ¥ç¶ããå¯èœæ§ããããŸãã ãã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã¯User EFIãšåŒã°ãã10幎以äžåã«éçºãããŸããã ãã以æ¥ãMathcadèªäœã¯èªèã§ããªãã»ã©å€åããŠããŸããããŸã£ããå€åããŠããŸããã ãã®ã€ã³ã¿ãŒãã§ã€ã¹ãããã±ãŒãžããç Žæ£ãããææããããŸããããå€ããŠãŒã¶ãŒããããèŠæ±ããMathcad Primeã®æ°ããããŒãžã§ã³ã§ã¯ããã®çããã€ã³ã¿ãŒãã§ã€ã¹ããã¹ãŠã®çããŠããã€ã³ã¿ãŒãã§ã€ã¹ãããçãçãããŠããŸãã
ã«ã¹ã¿ã ã©ã€ãã©ãªãäœæããããã®ããªãããããããã¬ã€ãããããŸããèšäºã®æåŸã«åŒçšããŸããã ã€ãŸããããã»ã¹ã¯æ¬¡ã®ããã«ãªããŸãã ãšã³ããªãã€ã³ãã§éåžžã®dllãäœæããŸãã ããŒããããšãã«ãé¢æ°ãç»é²ããŸãã åæã«ãé¢æ°èšè¿°åã§ãMathcadããã®åŸç¶ã®åŒã³åºãã®ã¢ãã¬ã¹ãçŽæ¥ç€ºããŸãã ããã«ã1ã€ã®ããŒãã«ã«ãšã©ãŒã¡ãã»ãŒãžãç»é²ããããšãã§ããŸãã ãšã©ãŒãçºçããå Žåã«ãŠãŒã¶ãŒé¢æ°ã«ãã£ãŠè¿ãããçµæã䜿çšããŠããã®ããŒãã«ããã¡ãã»ãŒãžãéžæã§ããŸãã ããããããã³å šäœã§ãã
é¢æ°èšè¿°åã¯æ¬¡ã®ããã«ãªããŸãã
FUNCTIONINFOæ§é
typedef LRESULT (* LPCFUNCTION ) ( void * const, const void * const, ... ); // The FUNCTIONINFO structure contains the information that Mathcad uses to register a // user function. Refer below for each member and its description. typedef struct tagFUNCTIONINFO { // Points to a NULL-terminated string that specifies the name of the user // function. char * lpstrName; // Points to a NULL-terminated string that specifies the parameters of the // user function. char * lpstrParameters; // Points to a NULL-terminated string that specifies the function description. char * lpstrDescription; // Pointer to the code that executes the user function. LPCFUNCTION lpfnMyCFunction; // Specifies the type of value returned by the function. The values are // COMPLEX_ARRAY or COMPLEX_SCALAR. long unsigned int returnType; // Specifies the number of arguments expected by the function. Must be // between 1 and MAX_ARGS. unsigned int nArgs; // Specifies an array of long unsigned integers containing input parameter // types. long unsigned int argType[ MAX_ARGS ]; } FUNCTIONINFO;
åé¡ã¯ã.netèšèªã§ãããè¡ã£ãå Žåãç¬èªã®é¢æ°ãèšè¿°ããæ¹ãã¯ããã«äŸ¿å©ã«ãªãããšã§ãã ãã ãããããè¡ãçŽæ¥çãªæ¹æ³ã¯ãC ++ / CLIã䜿çšããããšã§ãã C ++ / CLIãŸãã¯ããŒã·ã£ãªã³ã°æ§é ãžã®ã¢ããã¿ãŒãä»ããŠåãŠãŒã¶ãŒæ©èœããã©ããããããªãã·ã§ã³ã¯ãéçŸå®çã§ãããæ°åŠããã°ã©ã ã®ãŠãŒã¶ãŒããã®èªæã§ãªãç¥èãå¿ èŠãšãããããããã«åŽäžã§ãããšæããŸãã .Net User EFIãšåŒã°ããæ±çšã©ãããŒãæäŸããããšæããŸãã
åé¡ã¯ãæ¥ç¶ããããã¹ãŠã®ã¢ã»ã³ããªã®ãã¹ãŠã®é¢æ°ã®ä»£ããã«ç»é²ã§ãããŠãããŒãµã«é¢æ°ãäœæããæ¹æ³ã§ãããåæã«ãšã³ããªãã€ã³ãã§ç¹å®ã®ã¢ã»ã³ããªããç¹å®ã®é¢æ°ãåŒã³åºãããã«å¿ èŠãªãã¹ãŠã®æ å ±ãååŸããŸãã ãã®ãããªé¢æ°ãé 眮ãããŠããäžéã©ã€ãã©ãªã¯ãæ¥ç¶ãããŠããã¢ã»ã³ããªãšé¢æ°ã®ä»»æã®æ°ã§èªåçã«åäœããã¯ãã§ãã
ãã®ãããªæ®éæ§ãå®è£ ããã«ã¯ã1ã€ã®éèŠãªåé¡ããããŸãã Mathcadã§ã¯ãåŒã³åºãããé¢æ°ã®ã¢ãã¬ã¹ãæå®ããå¿ èŠãããããããã¿ã€ãèªäœã¯å¯å€æ°ã®ãã©ã¡ãŒã¿ãŒãæã€ãšå®£èšãããŠããŸãã æ±çšé¢æ°ã®ãšã³ããªãã€ã³ãã§ã¯ããã©ã¡ãŒã¿ãŒãæã€ã¹ã¿ãã¯ã®ãµã€ãºãç°ãªããããé¢æ°ãæšæºçãªæ段ã§åŒã³åºããããšãã«ãã®æ å ±ã転éããæ¹æ³ã¯ãããŸããã ã³ã³ãã€ã«ãããã³ãŒãèªäœã«ãã£ãŠæ±ºå®ãããŸãã äžèšã®æ§é ã§ã¯ãã¢ãã¬ã¹èªäœã®ã¿ããã©ã¡ãŒã¿ãŒãšããŠæ©èœããããã«ãã£ãŠãããé¢æ°ã®åŒã³åºããå¥ã®é¢æ°ã®åŒã³åºããšåºå¥ã§ããŸãã
ãããŠãããã§ç§ãã¡ã®èãã¯ãã³ãŒãã€ã³ãžã§ã¯ã·ã§ã³ãšåŒã°ããããç¥ããã1ã€ã®ãœãªã¥ãŒã·ã§ã³ã«å°éããã¯ãã§ãã ããã«ã€ããŠã¯äœåºŠãæžããŠããŸããããã®ãããªãã¯ããã¯ã䜿çšããå®çšçãªæçšãªäŸã¯ããŸããããŸããã ããæå³ã§ã¯ãdllããã®é¢æ°åŒã³åºããã€ã³ã¿ãŒã»ããããŸãããã¹ãŠãå°ãå ·äœçã«èŠããŸãããã¯ããã«åçŽã§ãã
ã¢ã€ãã¢
ããã§ãäœãæ³šå ¥ããå°å ¥ããã©ãã§ããªãããã®ã§ãããã ç¶æ³ãããäžåºŠæ確ã«ããŸãããã ãã¹ãŠã®åŒã³åºããåäžã«åŠçããåŒã³åºãããé¢æ°ã®ã¿ã€ãã«å¿ããŠããããåæ£ãããŠãããŒãµã«é¢æ°ãäœæããŸãã Mathcadã¯äœããçããã¹ãã§ã¯ãããŸããããåŒã³åºããã©ã¡ãŒã¿ãŒã«é¢ãããŠãããŒãµã«é¢æ°ã®ãšã³ããªãã€ã³ãã®ã©ããããè¿œå æ å ±ãååŸããå¿ èŠããããŸãã
解決çã¯ãMathcadã«ç»é²ããã¢ãã¬ã¹ã§ã³ãŒããåçã«çæããããšã§ãã åçã³ãŒãçšã«å€ãã®ã¹ããŒã¹ãã¡ã¢ãªå ã«ç¢ºä¿ããŸãã ãã®ã³ãŒãã¯ããã©ã¡ãŒã¿ãŒããŠãããŒãµã«é¢æ°ã«æž¡ãéã«è£å©çãªäœæ¥ãå®è¡ããŸãã äºåã«2ã€ã®ãã©ã¡ãŒã¿ãŒã§ååã ãšèšããŸããããã¯ãèªã¿èŸŒãŸããã¢ã»ã³ããªã®é åã®ã¢ã»ã³ããªçªå·ãšãã¢ã»ã³ããªããã®é¢æ°ã®çªå·ã§ãã ãã©ã¡ãŒã¿ãŒãæž¡ãã«ã¯ãã°ããŒãã«å€æ°ãšã¹ã¿ãã¯ã®2ã€ã®æ¹æ³ããããŸãã æåã®ãªãã·ã§ã³ãéžãã ã®ã¯ã ã¹ã¿ãã¯ãã©ã³ã¹ïŒãã©ã¡ãŒã¿ãŒãé 眮ãããŠããïŒãæ··ä¹±ãããããšã¯ç°¡åã§ãããç§ãã¡ã®å Žåãããã埩å ããããšã¯é£ãããšæããŸãã
ãŠãŒã¶ãŒé¢æ°ã«ã¯3çš®é¡ã®ãã©ã¡ãŒã¿ãŒãããªãããããã¯ãã¹ãŠãã€ã³ã¿ãŒã«ãã£ãŠæž¡ãããããšãå¿ããŠããŸãããMCSTRINGãCOMPLEXSCALARãããã³COMPLEXARRAYã§ãã æ倧æ°ãå¶éãããŠããŸã-10åã ããã«ãããæ±çšé¢æ°ã§ã®ãã©ã¡ãŒã¿ãŒè§£æã®å®è£ ãç°¡çŽ åãããŸãã
å®è£
ããã§ãå®è£ 段éãšãã®åŸã«çºçããã€ãã³ãã®ç¹å®ã®ã·ãŒã±ã³ã¹ã解æããæºåãã§ããŸããã
ã¹ããã1 ãŠãŒã¶ãŒã¯ãé¢æ°ã«é¢ããå¿ èŠãªæ å ±ãå«ãIFunctionã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ãã.netã¯ã©ã¹ãäœæããŸãã ã¢ã»ã³ããªã«ã³ã³ãã€ã«ããuserefiãã©ã«ããŒã«ã³ããŒããŸãã ãŸãããã®ãã©ã«ããŒã«ã¯äžéã¢ã»ã³ããªãå¿ èŠã§ãããããnetefiãšåŒã³ãŸãã
ã¹ããã2 Mathcadãèµ·åãããšãnetefiã¡ãã£ãšãŒã·ã§ã³ã¢ã»ã³ããªã¯ãŠãŒã¶ãŒã©ã€ãã©ãªãšããŠèªèãããŸãã çŸåšã®ãã©ã«ããŒã§ãã¹ãŠã®.netã¢ã»ã³ããªãæ€çŽ¢ããIFunctionã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£ ã®ããã«ãããã®é¢æ°ãåæããŸãã
ã¹ããã3 netefiã¯ãã¢ã»ã³ããªãšé¢æ°ã«é¢ããæ å ±ãå éšé åã«æ ŒçŽããŸããé¢æ°ãå®çŸ©ããã«ã¯ãã¢ã»ã³ããªã€ã³ããã¯ã¹ãšãã®äžã®é¢æ°ã€ã³ããã¯ã¹ã®2ã€ã®çªå·ãå¿ èŠã§ãã
ã¹ããã4 netefiã¯ãã¹ãŠã®é¢æ°ãç¹°ãè¿ããæšæºçãªæ¹æ³ã§Mathcadã«ç»é²ããŸãããFUNCTIONINFOæ§é äœã®ã¢ãã¬ã¹ãã£ãŒã«ãã«åçã³ãŒããžã®ãªã³ã¯ãèšè¿°ããŸãããã®åœ¢åŒã¯åã®ã¹ãããã®2ã€ã®ã€ã³ããã¯ã¹ã«ãã£ãŠæ±ºå®ãããŸãã
ããã¯ãå ·äœçãªå®è£ ã¡ãœããã®å®è£ ãã©ã®ããã«èŠãããã§ãïŒ
åçã³ãŒã
static int assemblyId = -1; static int functionId = -1; static PBYTE pCode = NULL; #pragma unmanaged LRESULT CallbackFunction( void * out, ... ) { return ::UserFunction( & out ); } #pragma managed // TODO: 64-bit. void Manager::InjectCode( PBYTE & p, int k, int n ) { // ( ) . * p++ = 0xB8; // mov eax, imm32 p[0] = k; p += sizeof( int ); * p++ = 0xA3; // mov [assemblyId], eax ( int * & ) p[0] = & assemblyId; p += sizeof( int * ); // ( ) . * p++ = 0xB8; // mov eax, imm32 p[0] = n; p += sizeof( int ); * p++ = 0xA3; // mov [functionId], eax ( int * & ) p[0] = & functionId; p += sizeof( int * ); // jmp to CallbackFunction. * p++ = 0xE9; ( UINT & ) p[0] = ( PBYTE ) ::CallbackFunction - 4 - p; p += sizeof( PBYTE ); }
InjectCodeïŒïŒã¡ãœããã¯ãMathcadã§é¢æ°ãç»é²ãããšãã«ã«ãŒãã§åŒã³åºãããŸãã ã°ããŒãã«å€æ°assemblyIdããã³functionIdã¯ãåŒã³åºãäžã®é¢æ°ã®ã¿ã€ãã決å®ããããã«äœ¿çšãããŸãã ãã®ããã«åäœããŸãã åé¢æ°ã®Mathcadã¯ããã®ãããªåçã³ãŒããžã®ãªã³ã¯ãåãåããŸãã ãã®å ŽåãããŒãæã«æ¢ç¥ã®ã¢ã»ã³ããªã€ã³ããã¯ã¹ïŒãã©ã¡ãŒã¿kïŒã¯assemblyIdã«æžã蟌ãŸããé¢æ°ã€ã³ããã¯ã¹ã¯functionId-ãã©ã¡ãŒã¿nã«æžã蟌ãŸããŸãã 次ã«ãCallbackFunctionïŒïŒãžã®ç¡æ¡ä»¶é·ç§»ããããããã§ãŠãããŒãµã«é¢æ°ãåŒã³åºãããŸãã ããã¯ããããŒãžã³ãŒããUserFunctionïŒïŒã§åŒã³åºããããã«ããããã§ãã ã¢ã³ãããŒãž/ãããŒãžãã£ã¬ã¯ãã£ãã¯ãCallbackFunctionïŒïŒã§ãããèš±å¯ããŸããã
ãŠãããŒãµã«é¢æ°ã®ãã©ã¡ãŒã¿ãŒã¯CallbackFunctionïŒïŒã¹ã¿ãã¯ã®åŒã³åºããã€ãŸã ãã©ã¡ãŒã¿ã®é åïŒæ»ãå€ã¯åãå Žæã«ãããŸãïŒã åçã³ãŒãã¯ã¹ã¿ãã¯ãæãªããªããããCallbackFunctionïŒïŒãå®äºããåŸãå¶åŸ¡ã¯Mathcadã«æ»ããŸãã ããããã¹ãŠã®éæ³ã§ãã
ã¹ããã5 ç»é²ãå®äºããããMathcadããã¥ã¡ã³ãã§ãŠãŒã¶ãŒå®çŸ©é¢æ°ãåŒã³åºãããšãã§ããŸãã ãŠãããŒãµã«é¢æ°UserFunctionïŒïŒã¯ãã°ããŒãã«ãã©ã¡ãŒã¿ãŒassemblyIdããã³functionIdãããŠãŒã¶ãŒé¢æ°ã®åã埩å ãããã©ã¡ãŒã¿ãŒã®æ°ãšåãèªèããŠã¹ã¿ãã¯ã解æã§ããããã«ãªããŸããã
ã¹ããã6 é¢æ°ãã©ã¡ãŒã¿ãŒã®ã¢ã³ãããŒãžã¿ã€ãã¯ãããããæååã®MCSTRINGãTComplexã®COMPLEXSCALARïŒç«¶åãçºçããªãããã«.Net 4.0ã®Complexã䜿çšããªãã£ãïŒãããã³TComplexã®COMPLEXARRAYã«çœ®ãæããããŸã[ã]ã
ã¹ããã7 é¢æ°ã®IFunction.NumericEvaluationã¡ãœããã®å®è£ ãåŒã³åºãããŸãã è¿ãããçµæã¯ãéã®å€æã·ãŒã±ã³ã¹ãçµãŠMathcadã«æž¡ãããŸãã
å®è£ ã«ã€ããŠ
ãã®ç¹å®ã®å®è£ æ¹æ³ãå€å°æ確ã«èª¬æãããšæããŸãã ãããžã§ã¯ãèªäœã®ãœãŒã¹ã³ãŒãã«ã€ããŠã¯ãç°å¢ãšããã€ãã®è©³çŽ°ã«ã€ããŠç°¡åã«èšåãã䟡å€ããããŸãã Visual Studio 2012ãC ++ / CLIã.Net Framework 2.0ãéçºç°å¢ãšããŠäœ¿çšãããŸãïŒå¯Ÿå¿ããã¢ãŒãã¯ãããžã§ã¯ãããããã£ã§èšå®ãããŸãïŒã äžè¬çã«ãåçã³ãŒãã¯ããã深床ã«äŸåããããã64ãããè¡šçŸã«ããæ¹æ³ãæ£ç¢ºã«ã¯ããããªãããããã¹ãŠã®ãããžã§ã¯ãã¯32ããããã·ã³çšã«ã³ã³ãã€ã«ããããã«æ§æãããŠããŸãã å€ãã®å€æŽã¯ãªãã ãããšèšãããŸãããã
ã°ããŒãã«å€æ°ã®äœ¿çšã¯é©åã§ã¯ãããŸããããMathcadã§ã®äœæ¥ã«ã¯è€æ°ã®é¢æ°ãäžåºŠã«åŒã³åºãå¿ èŠã¯ãããŸããã ããã§ãã¹ãŠãé çªã«è¡ãããŸãã
ãŸããäžéã¢ã»ã³ããªã¯ãæ°ããç°å¢ã§å€ãã€ã³ã¿ãŒãã§ã€ã¹ãå®å šã«äœ¿çšã§ããããã«ãããããã«ããã€ãã®ã¢ã€ãã¢ãå®è£ ããŸãã ããã¯ãšã©ãŒåŠçã«é©çšãããåå¥ã«èšè¿°ããå¿ èŠããããŸãã ãã¹ãŠã®ã¡ã€ã³ã³ãŒãã¯ã1ã€ã®Managerã¯ã©ã¹ïŒnetefi.cppïŒã«éäžããŠããŸãã ãã¹ãã±ãŒã¹ãåæãããšãIFunctionã€ã³ã¿ãŒãã§ã€ã¹ã®æäœæ¹æ³ãç解ã§ããŸãã ç°ãªãèšèªã®ãã¹ãã±ãŒã¹ã¯ãã¹ãŠåãããšãè¡ããã»ãŒåãååã§åŒã°ããŸãã
äŸã¯ãMathcad 15ããã³Mathcad Prime 3.0ã§ãã¹ããããŠããŸãã ãŠãŒã¶ãŒEFIã€ã³ã¿ãŒãã§ã€ã¹èªäœã¯10幎以äžå€æŽãããŠããªãããïŒæ¢ã«å€æŽãããããšã¯ã»ãšãã©ãããŸããïŒãããŒãžã§ã³11以éã®Mathcadã®ä»ã®ããŒãžã§ã³ã§èª¬æãããŠããæ¹æ³ã䜿çšã§ããŸãã Mathcad Prime 3.0ã§ã¯ããŠãŒã¶ãŒé¢æ°ã«æ°ããååïŒã«ã¹ã¿ã é¢æ°ïŒãä»ããããŸããããå¡ãã€ã¶ãã¯åãã§ãã
ãã¹ãã±ãŒã¹
äžèšã®ããã«ã ããã§èŠã€ããããšãã§ããŸãã ãã ããMathcadã®ç¹å®ã®åœ¢åŒã®.netã«ã¹ã¿ã é¢æ°ã衚瀺ããªãã£ãå Žåããã®èšäºã¯å®å šã§ã¯ãããŸããã
1ã€ã®æååãã©ã¡ãŒã¿ãŒã«å¯ŸããŠechoé¢æ°ãã©ã®ããã«ãªãããèŠãŠã¿ãŸãããã
CïŒãªãã·ã§ã³
using System; using NetEFI; public class csecho: IFunction { public FunctionInfo Info { get { return new FunctionInfo( "csecho", "s", "return string", typeof( String ), new[] { typeof( String ) } ); } } public FunctionInfo GetFunctionInfo( string lang ) { return Info; } public bool NumericEvaluation( object[] args, out object result ) { result = args[0]; return true; } }
VB.Netãªãã·ã§ã³
Imports NetEFI Public Class vbecho Implements IFunction Public ReadOnly Property Info() As FunctionInfo _ Implements IFunction.Info Get Return New FunctionInfo("vbecho", "s", "return string", _ GetType([String]), New Type() {GetType([String])}) End Get End Property Public Function GetFunctionInfo(lang As String) As FunctionInfo _ Implements IFunction.GetFunctionInfo Return Info End Function Public Function NumericEvaluation(args As Object(), ByRef result As Object) As Boolean _ Implements IFunction.NumericEvaluation result = args(0) Return True End Function End Class
C ++ / CLIãªãã·ã§ã³
#pragma once using namespace System; using namespace System::Text; using namespace NetEFI; public ref class cppecho: public IFunction { public: virtual property FunctionInfo^ Info { FunctionInfo^ get() { return gcnew FunctionInfo( "cppecho", "s", "return string", String::typeid, gcnew array<Type^> { String::typeid } ); } } virtual FunctionInfo^ GetFunctionInfo(String^ lang) { return Info; } virtual bool NumericEvaluation( array< Object^ > ^ args, [Out] Object ^ % result ) { result = args[0]; return true; } };
ãã®ä»
äž»ãªæ©èœã¯ã»ãŒæºåãã§ããŠããŸãããããã€ãã®æ¬ ç¹ããããŸãã ããšãã°ããŠãããŒãµã«é¢æ°ã®äœæ¥ã¯å¥ã®ã¹ã¬ããã§å®è¡ããããšãæãŸããã§ãã ããã¯æåã«ããããšã®1ã€ã§ãã isUserInterruptedã®åŒã³åºãã«ããäœæ¥ã®äžæã¯ãæ°ããã€ã³ã¿ãŒãã§ãŒã¹ã«ã¯åæ ãããŸããã ãããŸã§ã®ãšãããMathcadèªäœãæ©èœãäžæã§ããããšãæåŸ ãããŠããŸãã èããŠã¿ããšãã¹ããªãŒã ã§ã®äœæ¥ãšå ±éç¹ããããŸãã
ãããŸã§ã®çŸåšã®ãããžã§ã¯ãã¯ã32ãããã·ã¹ãã ã§ã®ã¿åäœããŸãã 64ãããæ§æãè¿œå ããã«ã¯ã64ãããã·ã¹ãã ã§åçã³ãŒãã®åäœããã¹ãããå¿ èŠããããŸãã ãŸã ãã®ãããªæ©äŒã¯ãããŸããã
ãŠãŒã¶ãŒå®çŸ©é¢æ°å ã§COMãæäœããããšããæããã«äžå¯èœã«ãªããŸããã ãŠã§ãã«ã¡ã©ããç»åãäœæããæ©èœãå®è£ ãããšãã«ãããã«åºäŒããŸããã æšæºãªãã·ã§ã³ã®1ã€ã¯ãã¯ãªããããŒããžã®ã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããããšã§ããããã®ãããã¹ããªãŒã ã¯STAThreadAttributeå±æ§ãæã€å¿ èŠããããšèšã£ãŠãæ©èœããŸããã§ããã Graphics.CopyFromScreenã䜿çšããŠåé¡ã解決ããŸããã ç解ããå¿ èŠããããŸãã
æ¬ èœããŠããã¢ã»ã³ããªã®ããŠã³ããŒããããŸã 確å®ã«è¡ãããŠããŸããã Assembly :: LoadFileïŒïŒã«ãã£ãŠäœ¿çšãããŸãã Assembly :: LoadFromïŒïŒã䜿çšããå ŽåãMathcadã¯ãã®å Žæã§ãã³ã°ããŸãã æ··åã³ãŒãã®ãããã°ã«ã¯ãŸã åé¡ããããŸãã ãªãããã®çç±ã§ãç§ã«ã¯ããŸããããŸããã§ããã å®éã«ã³ãŒãããããã°ããŸãããããã°ã®ã¿ãä¿åãããŸããã
誰ãã䌌ããããªããšãããŠãç§ã®ã³ãŒããç°¡çŽ åããããã®è¯ãã¢ã€ãã¢ãææ¡ã§ãããããããŸããã ç§ã¯ãã¹ãŠã®å®çšçãªãªãã·ã§ã³ã«è³ãåŸããŸãã 誰ããç§ã®ãããžã§ã¯ããæ··åã¢ãŒãã®ã¹ã¿ãžãªãããã¬ãŒã®äžã§åäœããããçŽ æŽããããšæããŸãã ãããŸã§ã®ãšãããã¢ã³ãããŒãžã³ãŒãã®ãã¬ãŒã¯ãã€ã³ãã®ã¿ãæ©èœããŸãã ãã¡ããããã¹ãã±ãŒã¹ã§ã¯ãã³ãŒããããŒãã³ã°ã§ããŸãã
åç §è³æ
0. ãã€ãã£ãã³ãŒããåçã«çæããã³å®è¡ããæ¹æ³
1. githubã®ãœãŒã¹ãšãã¹ãã±ãŒã¹ ã
2. ãŠãŒã¶ãŒDLLã®äœæ ïŒpdfïŒã
3. .NetãŠãŒã¶ãŒEFIã€ã³ã¿ãŒãã§ã€ã¹ ïŒã¡ã€ã³PTCãã©ãŒã©ã ã®ã¹ã¬ããïŒã
4. Webã«ã¡ã©ã®ãµã³ãã«ã®ãœãŒã¹ãšãã«ã ïŒä»¥äžã®åããã©ã³ãå ïŒã
5. Mathcad EFIãã©ã°ã€ã³ ïŒéæ©èœãå®è¡ããä»ã®ãããžã§ã¯ãã¯ããããŒãžã³ãŒãããã¢ã³ãããŒãžã³ãŒããåŒã³åºããŸãïŒã