ã¯ããã«
ãã®èšäºã§ã¯ãã1CïŒEnterpriseãã·ã¹ãã ã®å€éšã³ã³ããŒãã³ãã®åäœã«ã€ããŠèª¬æããŸãã
ã1CïŒEnterpriseãã·ã¹ãã ããŒãžã§ã³8.2çšã®å€éšã³ã³ããŒãã³ããéçºããããã»ã¹ã瀺ããŸããããã¯ãäœæ¥ã®ãã¡ã€ã«ããŒãžã§ã³ãåããWindowsãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§å®è¡ãããŸãã ãã®äœæ¥ãªãã·ã§ã³ã¯ãäžå°äŒæ¥åãã«èšèšãããã»ãšãã©ã®ãœãªã¥ãŒã·ã§ã³ã§äœ¿çšãããŸãã VKã¯C ++ããã°ã©ãã³ã°èšèªã§å®è£ ãããŸãã
å€éšã³ã³ããŒãã³ãã1CïŒãšã³ã¿ãŒãã©ã€ãºã
ã1CïŒEnterpriseãã¯æ¡åŒµå¯èœãªã·ã¹ãã ã§ãã ã·ã¹ãã ã®æ©èœãæ¡åŒµããããã«ãå€éšã³ã³ããŒãã³ãïŒVKïŒã䜿çšãããŸãã éçºè ã®èŠ³ç¹ããèŠããšãVCã¯ããããã£ãšã¡ãœãããæã€å€éšãªããžã§ã¯ãã§ããã1CïŒEnterpriseã·ã¹ãã ã§åŠçããã€ãã³ããçæããããšãã§ããŸãã
å€éšã³ã³ããŒãã³ãã䜿çšããŠã1CïŒEnterpriseã«çµã¿èŸŒãŸããŠããããã°ã©ãã³ã°èšèªã䜿çšããŠå®è£ ããããšãå°é£ãŸãã¯äžå¯èœãªåé¡ã®ã¯ã©ã¹ã解決ã§ããŸãã ç¹ã«ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãšã®äœã¬ãã«ã®å¯Ÿè©±ãå¿ èŠãšããã¿ã¹ã¯ã¯ãããšãã°ç¹å®ã®æ©åšãæäœããããã«ããã®ã¯ã©ã¹ã«èµ·å ããå¯èœæ§ããããŸãã
1CïŒãšã³ã¿ãŒãã©ã€ãºã·ã¹ãã ã¯ãå€éšã³ã³ããŒãã³ããäœæããããã«2ã€ã®ãã¯ãããžãŒã䜿çšããŸãã
- ãã€ãã£ãAPIã䜿çšãã
- COMãã¯ãããžãŒã䜿çšãã
äžèšã®2ã€ã®ãã¯ãããžãŒéã®å¶éãèãããšãéãã¯ãããã§ããããããã€ãã£ãAPIã䜿çšããVKã®éçºãæ€èšããŸãã å¿ èŠã«å¿ããŠãå®è£ ãããéçºãé©çšããŠCOMãã¯ãããžãŒã䜿çšããŠVKãéçºã§ããŸãããŸããããããªå€æŽãå ããŠããã¡ã€ã«æäœã¢ãŒã以å€ã®äœæ¥ãªãã·ã§ã³ãåãã1CïŒãšã³ã¿ãŒãã©ã€ãºã·ã¹ãã ã§äœ¿çšã§ããŸãã
VKæ§é
1CïŒEnterpriseã·ã¹ãã ã®å€éšã³ã³ããŒãã³ãã¯ãDLLã©ã€ãã©ãªãšããŠæäŸãããŸãã ã©ã€ãã©ãªã³ãŒãã¯ãIComponentBaseã®äžäœã¯ã©ã¹ãèšè¿°ããŠããŸãã äœæãããã¯ã©ã¹ã§ã¯ãå€éšã³ã³ããŒãã³ãã®æ©èœã®å®è£ ãæ åœããã¡ãœãããå®çŸ©ããå¿ èŠããããŸãã ãªãŒããŒã©ã€ãå¯èœãªã¡ãœããã«ã€ããŠã¯ãè³æã®èª¬æã®éçšã§ããã«è©³ãã説æããŸãã
ãã¢VKãèµ·åãã
ãã£ã¬ã³ãžïŒ
- ITSãµãã¹ã¯ãªãã·ã§ã³ã§æäŸããã1Cã®å€éšã³ã³ããŒãã³ãã¡ã«ããºã ã®åºæ¬æ©èœã瀺ãããã«èšèšãããå€éšã³ã³ããŒãã³ããæ§ç¯ããŸã
- ãã¢ã³ã³ããŒãã³ãã1Cæ§æã«æ¥ç¶ããŸã
- 宣èšãããé¢æ°ã®æ£ããæ©èœã確èªããŠãã ãã
ç·šé
ãã¢VKã¯ãITSãµãã¹ã¯ãªãã·ã§ã³ãã£ã¹ã¯ã®ãã£ã¬ã¯ããªã/ VNCOMP82 / example / NativeAPIãã«ãããŸãã
Microsoft Visual Studio 2008ã䜿çšããŠãã¢VKããã«ãããŸãããã®è£œåã®ä»ã®ããŒãžã§ã³ã¯ã䜿çšãããŠããVisual Studioãããžã§ã¯ã圢åŒããµããŒãããŠããŸããã
AddInNativeãããžã§ã¯ããéããŸãã ãããžã§ã¯ãèšå®ã§ã¯ããã£ã¬ã¯ããªããããžã§ã¯ãã®ãã«ãã«å¿ èŠãªããããŒãã¡ã€ã«ã«æ¥ç¶ããŸãã ããã©ã«ãã§ã¯ããããã¯ITSãã©ã€ãã®/ VNCOMP82 / includeãã£ã¬ã¯ããªã«ãããŸãã
ã¢ã»ã³ããªã®çµæã¯ããã¡ã€ã«/bind/AddInNative.dllã§ãã ããã¯ã1Cæ§æã«æ¥ç¶ããããã®ã³ã³ãã€ã«æžã¿ã©ã€ãã©ãªã§ãã
1Cæ§æãžã®VKæ¥ç¶
空ã®1Cæ§æãäœæããŸãã
以äžã¯ããããŒãžã¢ããªã±ãŒã·ã§ã³ã¢ãžã¥ãŒã«ã®ã³ãŒãã§ãã
; () ("...\bind\AddInNative.dll", "DemoVK", .Native); = ("AddIn.DemoVK.AddInNativeExtension");
1Cæ§æã®éå§æã«ãšã©ãŒãå ±åãããªãã£ãå ŽåãVKã¯æ£åžžã«æ¥ç¶ãããŠããŸãã
äžèšã®ã³ãŒããå®è¡ããçµæã DemoCompãªããžã§ã¯ããæ§æã®ã°ããŒãã«è¡šç€ºã«è¡šç€ºãããŸããããã«ã¯ãå€éšã³ã³ããŒãã³ãã®ã³ãŒãã§å®çŸ©ãããããããã£ãšã¡ãœããããããŸãã
çµã¿èŸŒã¿æ©èœã®ãã¢ã³ã¹ãã¬ãŒã·ã§ã³
ãã¢VKã®ããã©ãŒãã³ã¹ã確èªããŸãã ãããè¡ãã«ã¯ãããã€ãã®ããããã£ãèšå®ããã³èªã¿åããVKã¡ãœãããåŒã³åºããVKã¡ãã»ãŒãžãåä¿¡ããã³åŠçããŸãã
ITSãã£ã¹ã¯ã§æäŸãããããã¥ã¡ã³ãã«ã¯ããã¢VKã®æ¬¡ã®æ©èœãèšèŒãããŠããŸãã
- ã³ã³ããŒãã³ããªããžã§ã¯ãã®ç¶æ
ãå¶åŸ¡ãã
ã¡ãœããïŒ æå¹å ã ç¡å¹å
ããããã£ïŒ å«ãŸãã - ã¿ã€ããŒå¶åŸ¡
1ç§ããšã«ãã³ã³ããŒãã³ãã¯ã ã³ã³ããŒãã³ã ã ã¿ã€ããŒãã©ã¡ãŒã¿ãŒãããã³ã·ã¹ãã ã¯ããã¯ã«ãŠã³ã¿ãŒã®è¡ãå«ãã¡ãã»ãŒãžã1CïŒEnterpriseã·ã¹ãã ã«éä¿¡ããŸãã
ã¡ãœããïŒ StartTimer ã StopTimer
ããããã£ïŒ ã¯ãã¿ã€ã㌠- ShowInStatusStrokeã¡ãœãããã¡ãœããã«æž¡ãããããã¹ãããã©ã¡ãŒã¿ãŒãšããŠã¹ããŒã¿ã¹ããŒã«è¡šç€ºããŸãã
- ã¡ãœããã®ããŠã³ããŒãç»å ã æå®ããããã¡ã€ã«ããã€ã¡ãŒãžãããŒããããã€ããªããŒã¿ã®åœ¢åŒã§1CïŒEnterpriseã·ã¹ãã ã«è»¢éããŸãã
ãããã®æ©èœã®æäœæ§ãæ€èšŒããŸãã ãããè¡ãã«ã¯ã次ã®ã³ãŒããå®è¡ããŸãã
; () (...); = ("AddIn.DemoVK.AddInNativeExtension"); .(); (.); .(); (.); .(); (, , ) ( + " " + + " " + );
æ§æãéå§ããçµæãç»åã«ç€ºãããŠããŸã
[ã¡ãã»ãŒãž]ããã«ã«ã¯ãDemoCompãDisableïŒïŒããã³DemoCompãEnableïŒïŒã¡ãœããã®åŒã³åºãã®çµæã衚瀺ãããŸã ã åãããã«ã®åŸç¶ã®è¡ã«ã¯ãVCããåä¿¡ããã¡ãã»ãŒãžãåŠçããçµæïŒããããSource ã Event ã DataïŒãå«ãŸããŠããŸãã
å€éšã³ã³ããŒãã³ãã®ä»»æã®åå
ã¿ã¹ã¯ïŒå€éšã³ã³ããŒãã³ãã®ååãanyã«å€æŽããŸãã
åã®ã»ã¯ã·ã§ã³ã§ã¯ã AddInNativeExtensionèå¥åã䜿çšããŸããã ããã®æå³ã¯èª¬æãããŠããŸããã ãã®å Žåã AddInNativeExtensionã¯æ¡åŒµæ©èœã®ååã§ãã
VCã³ãŒãã§ã¯ã RegisterExtensionAsã¡ãœãããå®çŸ©ãããŠããŸããããã¯ãã·ã¹ãã å ã®VCã1CïŒEnterpriseã·ã¹ãã ã«åŸã§ç»é²ããããã«å¿ èŠãªååãè¿ããŸãã å€éšã³ã³ããŒãã³ãã®æ¬è³ªãããçšåºŠæããã«ããèå¥åãæå®ããããšããå§ãããŸãã
å€æŽãããæ¡åŒµåãæã€RegisterExtensionAsã¡ãœããã®å®å šãªã³ãŒãã¯æ¬¡ã®ãšããã§ãã
bool CAddInNative::RegisterExtensionAs(WCHAR_T** wsExtensionName) { wchar_t *wsExtension = L"SomeName"; int iActualSize = ::wcslen(wsExtension) + 1; WCHAR_T* dest = 0; if (m_iMemory) { if(m_iMemory->AllocMemory((void**)wsExtensionName, iActualSize * sizeof(WCHAR_T))) ::convToShortWchar(wsExtensionName, wsExtension, iActualSize); return true; } return false; }
äžèšã®äŸã§ã¯ãVKåã¯SomeNameã«å€æŽãããŸã ã 次ã«ãVCãæ¥ç¶ãããšãã«ãæ°ããååãæå®ããå¿ èŠããããŸãã
= ("AddIn.DemoVK.SomeName");
VKã®ããããã£ã®ãªã¹ãã®æ¡åŒµ
ãã£ã¬ã³ãžïŒ
- VCããããã£ã®å®è£ ã調ã¹ã
- èªã¿åãããã³æžã蟌ã¿å¯èœãªæååã¿ã€ãã®ããããã£ãè¿œå ããŸã
- æåŸã®ããããã£ã»ããã®ããŒã¿åãæ ŒçŽããæåååã®èªã¿åã/æžã蟌ã¿ããããã£ãè¿œå ããŸãã ããããã£å€ãèšå®ãããšããã¢ã¯ã·ã§ã³ã¯å®è¡ãããŸãã
- è¡ã£ãå€æŽãæ©èœããŠããããšã確èªããŠãã ããã
äœæãããã³ã³ããŒãã³ãã®ããããã£ã決å®ããã«ã¯ãéçºè ã¯æ¬¡ã®ã¡ãœãããAddInNative.cppã©ã€ãã©ãªã®ã³ãŒãã«å®è£ ããå¿ èŠããããŸãã
ã²ãã³ããããã¹
ãã®æ¡åŒµã®ããããã£ã®æ°ã0-ããããã£ããªãå Žåãè¿ããŸã
FindProp
ãã©ã¡ãŒã¿ã§ååãæž¡ãããããããã£ã®ã·ãªã¢ã«çªå·ãè¿ããŸã
getpropname
ã·ãªã¢ã«çªå·ãšéä¿¡ãããèšèªèå¥åã«ãã£ãŠããããã£ã®ååãè¿ããŸã
getpropval
æå®ãããã·ãªã¢ã«çªå·ãæã€ããããã£ã®å€ãè¿ããŸã
Setpropval
æå®ããã·ãªã¢ã«çªå·ã§ããããã£ã®å€ãèšå®ããŸã
IsPropReadable
æå®ãããã·ãªã¢ã«çªå·ãæã€ããããã£ãèªã¿åãæ©èœã®ãã©ã°ãè¿ããŸã
IsPropWritable
æå®ãããã·ãªã¢ã«çªå·ãæã€ããããã£ãæžã蟌ãæ©èœã®ãã©ã°ãè¿ããŸã
ãã©ã¡ãŒã¿ã®ãªã¹ããå«ãã¡ãœããã®å®å šãªèª¬æã¯ãITSãã£ã¹ã¯ã§æäŸãããããã¥ã¡ã³ãã«è©³çŽ°ã«èª¬æãããŠããŸãã
CAddInNativeã¯ã©ã¹ã®äžèšã®ã¡ãœããã®å®è£ ãæ€èšããŠãã ããã
ãã¢VKã§ã¯ã Enabledããã³IsTimer ïŒ IsEnabledããã³IsTimerPresent ïŒã®2ã€ã®ããããã£ãå®çŸ©ãããŠããŸãã
ã©ã€ãã©ãªã³ãŒãã®ã°ããŒãã«ã¹ã³ãŒãã§2ã€ã®é åãå®çŸ©ãããŠããŸãã
static wchar_t *g_PropNames[] = {L"IsEnabled", L"IsTimerPresent"}; static wchar_t *g_PropNamesRu[] = {L"", L""};
ãã·ã¢èªãšè±èªã®ããããã£åãä¿åããŸãã ããããŒãã¡ã€ã«AddInNative.hã¯åæãå®çŸ©ããŸãã
enum Props { ePropIsEnabled = 0, ePropIsTimerPresent, ePropLast // Always last };
ePropIsEnabledããã³ePropIsTimerPresent㯠ãããããå€0ããã³1ã䜿çšããŠãããããã£ã·ãªã¢ã«çªå·ãæå³ã®ããèå¥åã«çœ®ãæããŸãã å€ã2ã®ePropLastã䜿çšããŠãããããã£ã®æ°ãååŸããŸãïŒGetNPropsã¡ãœããã䜿çšïŒã ãããã®ååã¯ã³ã³ããŒãã³ãã³ãŒãå ã§ã®ã¿äœ¿çšãããå€éšããã¯ã¢ã¯ã»ã¹ã§ããŸããã
FindPropããã³GetPropNameã¡ãœããã¯ã g_PropNamesããã³g_PropNamesRué åãæ€çŽ¢ããŸã ã
ã©ã€ãã©ãªã¢ãžã¥ãŒã«ã«ãã£ãŒã«ãå€ãæ ŒçŽããããã«ãCAddInNativeã¯ã©ã¹ã¯ã³ã³ããŒãã³ãããããã£ã®å€ãæ ŒçŽããããããã£ãå®çŸ©ããŸãã GetPropValããã³SetPropValã¡ãœããã¯ããããããããã®ããããã£ã®å€ãè¿ããèšå®ããŸãã
IsPropReadableã¡ãœãããšIsPropWritableã¡ãœããã¯ã©ã¡ãããã¢ããªã±ãŒã·ã§ã³ããžãã¯ã«åŸã£ãŠæž¡ãããããããã£ã®ã·ãªã¢ã«çªå·ã«å¿ããŠã trureãŸãã¯falseãè¿ããŸãã
ä»»æã®ããããã£ãè¿œå ããã«ã¯ã以äžãè¡ãå¿ èŠããããŸãã
- g_PropNamesããã³g_PropNamesRué å ïŒ AddInNative.cppãã¡ã€ã«ïŒã«è¿œå ããããããã£ã®ååãè¿œå ããŸã
- ePropLastã®åã®PropsåæïŒ AddInNative.hãã¡ã€ã«ïŒã§ãè¿œå ãããããããã£ãäžæã«èå¥ããååãè¿œå ããŸãã
- ããããã£å€ãä¿åããããã®ã¡ã¢ãªãæŽçããŸãïŒå¯Ÿå¿ããå€ãä¿åããã³ã³ããŒãã³ãã¢ãžã¥ãŒã«ãã£ãŒã«ããäœæããŸãïŒ
- GetPropValããã³SetPropValã¡ãœãããå€æŽããŠãåã®æé ã§å²ãåœãŠãããã¡ã¢ãªãšããåãããŸãã
- ã¢ããªã±ãŒã·ã§ã³ããžãã¯ã«åŸã£ãŠã IsPropReadableããã³IsPropWritableã¡ãœãããå€æŽããŸãã
ãã©ã°ã©ã1ã2ã5ãæ確ã«ããå¿ èŠã¯ãããŸããã ãããã®æé ã®å®è£ ã®è©³çŽ°ã«ã€ããŠã¯ããã®èšäºã®ä»é²ãã芧ãã ããã
ãã¹ãããããã£ã«ããããTestããã³Type Testãšããååãä»ããŸãããã 次ã«ããã©ã°ã©ã1ã®çµæã次ã®ããã«ãªããŸãã
static wchar_t *g_PropNames[] = {L"IsEnabled", L"IsTimerPresent", L"Test", L"TestType"}; static wchar_t *g_PropNamesRu[] = {L"", L"", L"", L""};
åæã®å°éå ·ã¯æ¬¡ã®ããã«ãªããŸãã
enum Props { ePropIsEnabled = 0, ePropIsTimerPresent, ePropTest1, ePropTest2, ePropLast // Always last };
ã³ãŒããå€§å¹ ã«ç°¡çŽ åããããã«ãSTL C ++ã䜿çšããŸãã ç¹ã«ã WCHARæååã䜿çšããã«ã¯ã wstringã©ã€ãã©ãªãæ¥ç¶ããŸãã
Testã¡ãœããã®å€ãä¿åããã«ã¯ãã¹ã³ãŒãã®CAddInNativeã¯ã©ã¹ã«ãã©ã€ããŒããã£ãŒã«ããå®çŸ©ããŸãã
string test1;
1CïŒEnterpriseãšå€éšã³ã³ããŒãã³ãéã§æååãã©ã¡ãŒã¿ãŒã転éããã«ã¯ã1CïŒEnterpriseã¡ã¢ãªãããŒãžã£ãŒã䜿çšãããŸãã 圌ã®äœåããã詳现ã«æ€èšããŠãã ããã ã¡ã¢ãªã®å²ãåœãŠãšè§£æŸã«ã¯ã ImemoryManager.hãã¡ã€ã«ã§å®çŸ©ãããŠããAllocMemoryé¢æ°ãšFreeMemoryé¢æ°ããããã䜿çšãããŸãã å¿ èŠã«å¿ããŠã1CïŒãšã³ã¿ãŒãã©ã€ãºã·ã¹ãã ã«æååãã©ã¡ãŒã¿ãŒãæž¡ããŸããå€éšã³ã³ããŒãã³ãã¯ã AllocMemoryé¢æ°ãåŒã³åºããŠã¡ã¢ãªãå²ãåœãŠãå¿ èŠããããŸãã 圌女ã®ãããã¿ã€ãã¯æ¬¡ã®ãšããã§ãã
virtual bool ADDIN_API AllocMemory (void** pMemory, unsigned long ulCountByte) = 0;
pMemoryã¯ãå²ãåœãŠãããã¡ã¢ãªã®ã¢ãã¬ã¹ãé 眮ããããã€ã³ã¿ã®ã¢ãã¬ã¹ã§ãã
ulCountByte-å²ãåœãŠãããã¡ã¢ãªã®ãµã€ãºã
æååã«ã¡ã¢ãªãå²ãåœãŠãäŸïŒ
WCHAR_T *t1 = NULL, *test = L"TEST_STRING"; int iActualSize = wcslen(test1)+1; m_iMemory->AllocMemory((void**)&t1, iActualSize * sizeof(WCHAR_T)); ::convToShortWchar(&t1, test1, iActualSize);
æååããŒã¿åãæäœããããã«ã wstring_to_pé¢æ°ã«ã€ããŠèª¬æããŸãã ãã©ã¡ãŒã¿ãšããŠwstringæååãåãåããŸãã é¢æ°ã®çµæã¯ãåããããtVariantæ§é ã§ãã æ©èœã³ãŒãïŒ
bool CAddInNative::wstring_to_p(std::wstring str, tVariant* val) { char* t1; TV_VT(val) = VTYPE_PWSTR; m_iMemory->AllocMemory((void**)&t1, (str.length()+1) * sizeof(WCHAR_T)); memcpy(t1, str.c_str(), (str.length()+1) * sizeof(WCHAR_T)); val -> pstrVal = t1; val -> strLen = str.length(); return true; }
次ã«ã GetPropValã¡ãœããã®switchã¹ããŒãã¡ã³ãã®å¯Ÿå¿ããcaseã»ã¯ã·ã§ã³ã¯æ¬¡ã®åœ¢åŒãåããŸãã
case ePropTest1: wstring_to_p(test1, pvarPropVal); break;
SetPropValã¡ãœããïŒ
case ePropTest1: if (TV_VT(varPropVal) != VTYPE_PWSTR) return false; test1 = std::wstring((wchar_t*)(varPropVal -> pstrVal)); break;
2çªç®ã®ããããã£ãå®è£ ããã«ã¯ã CaddInNativeã¯ã©ã¹ã®ãã£ãŒã«ããå®çŸ©ããŸã
uint8_t last_type;
ããã§ãæåŸã«éä¿¡ãããå€ã®ã¿ã€ããä¿åããŸãã ãããè¡ãã«ã¯ãCaddInNative :: SetPropValã¡ãœããã«ã³ãã³ããè¿œå ããŸãã
last_type = TV_VT(varPropVal);
ããã§ã2çªç®ã®ããããã£ã®å€ã®èªã¿åããèŠæ±ãããšã瀺ãããã¿ã¹ã¯ã«å¿ èŠãªå€last_typeãè¿ããŸãã
è¡ãããå€æŽã®æäœæ§ã確èªããŸãã
ãããè¡ãã«ã¯ã1Cæ§æã®å€èŠ³ããã©ãŒã ã«çµã¿èŸŒã¿ãŸãã
; () ("...", "DemoVK", .Native); = ("AddIn.DemoVK.SomeName"); . = 1; ((.)); . = ""; ((.)); . = ""; ((.)); ((.));
èµ·åã®çµæãã¡ãã»ãŒãžã®ã·ãŒã±ã³ã¹ãååŸãããŸãã
3
22
2çªç®ãš3çªç®ã®ã¡ãã»ãŒãžã¯ãåã®æé ã§èšå®ããããããã£ãèªã¿åã£ãçµæã§ãã æåãš2çªç®ã®ã¡ãã»ãŒãžã«ã¯ãæåŸã«èšå®ãããããããã£ã®ã¿ã€ãã®ã³ãŒããå«ãŸããŠããŸãã 3ã¯æŽæ°å€ã22ã¯æååå€ã«å¯Ÿå¿ããŸãã ã¿ã€ããšãã®ã³ãŒãã®å¯Ÿå¿ã¯ãITSãã£ã¹ã¯ã«ããtypes.hãã¡ã€ã«ã§èšå®ãããŸãã
ã¡ãœããã®ãªã¹ãã®æ¡åŒµ
ãã£ã¬ã³ãžïŒ
- 次ã®æ©èœã䜿çšããŠãå€éšã³ã³ããŒãã³ãã®æ©èœãæ¡åŒµããŸãã
- å€éšã³ã³ããŒãã³ãã¡ãœãããå®è£ ããæ¹æ³ãæ¢ã
- é¢æ°ã¡ãœããFunkts1ãè¿œå ããŸããããã¯ããã©ã¡ãŒã¿ãŒãšããŠ2è¡ïŒãParameter1ãããã³ãParameter2ãïŒãåããŸãã ãã®çµæããCheckã ãã©ã¡ãŒã¿1ããã©ã¡ãŒã¿2»
- è¡ã£ãå€æŽãæ©èœããŠããããšã確èªããŠãã ããã
äœæãããã³ã³ããŒãã³ãã®ã¡ãœããã決å®ããã«ã¯ãéçºè ã¯AddInNativeã©ã€ãã©ãªã®ã³ãŒãã«æ¬¡ã®ã¡ãœãããå®è£ ããå¿ èŠããããŸãã
GetNMethods ã FindMethod ã GetMethodName
ã¡ãœããã®æ°ãããããååŸããã¡ãœããã®æ°ãšååãæ€çŽ¢ããããã«èšèšãããŠããŸãã ããããã£ã®å¯Ÿå¿ããã¡ãœããã«äŒŒãŠããŸãã
Getnparams
æå®ãããã·ãŒã±ã³ã¹çªå·ãæã€ã¡ãœãããã©ã¡ãŒã¿ãŒã®æ°ãè¿ããŸãã ãã®çªå·ã®ã¡ãœãããååšããªããããã©ã¡ãŒã¿ããªãå Žåã0ãè¿ããŸã
GetParamDefValue
æå®ããã¡ãœããã®æå®ãããã©ã¡ãŒã¿ãŒã®ããã©ã«ãå€ãè¿ããŸã
HasRetVal
æ»ãå€ã®æå®ãããã·ãªã¢ã«çªå·ãæã€ã¡ãœããã®ååšã®ãã©ã°ãè¿ããŸããæ»ãå€ãæã€ã¡ãœããã®å Žåã¯trueãããã§ãªãå Žåã¯false
ã«ã©ã¹ãã
æå®ãããã·ãŒã±ã³ã¹çªå·ã§ã¡ãœãããå®è¡ããŸãã ã¡ãœãããfalseãè¿ããšãã©ã³ã¿ã€ã ãšã©ãŒãçºçãã1CïŒEnterpriseã¢ãžã¥ãŒã«ã®å®è¡ãçµäºããŸãã ãã©ã¡ãŒã¿ãŒã®é åã®ã¡ã¢ãªãŒã¯ã1CïŒEnterpriseã«ãã£ãŠå²ãåœãŠããã解æŸãããŸãã
ã«ã©ã¹ãã¡ã³ã¯
æå®ãããã·ãŒã±ã³ã¹çªå·ã§ã¡ãœãããå®è¡ããŸãã ã¡ãœãããfalseãè¿ããšãã©ã³ã¿ã€ã ãšã©ãŒãçºçãã1CïŒEnterpriseã¢ãžã¥ãŒã«ã®å®è¡ãçµäºããŸãã ãã©ã¡ãŒã¿ãŒã®é åçšã®ã¡ã¢ãªãŒã«ã¯ã1CïŒEnterpriseãå²ãåœãŠãããŸãã æ»ãå€ã®ã¿ã€ããæååãŸãã¯ãã€ããªããŒã¿ã®å Žåãã³ã³ããŒãã³ãã¯ã¡ã¢ãªãããŒãžã£ã®AllocMemoryé¢æ°ã䜿çšããŠã¡ã¢ãªãå²ãåœãŠãããã«ããŒã¿ãæžã蟌ã¿ããã®ã¢ãã¬ã¹ãæ§é äœã®å¯Ÿå¿ãããã£ãŒã«ãã«æ ŒçŽããŸãã 1CïŒãšã³ã¿ãŒãã©ã€ãºã¯ã FreeMemoryãåŒã³åºããŠãã®ã¡ââã¢ãªã解æŸããŸãã
ãã©ã¡ãŒã¿ã®ãªã¹ããå«ãã¡ãœããã®å®å šãªèª¬æã¯ãITSãã£ã¹ã¯ã§æäŸãããããã¥ã¡ã³ãã«è©³çŽ°ã«èª¬æãããŠããŸãã
äžèšã®ã¡ãœããã®å®è£ ãæ€èšããŠãã ããã
ã³ã³ããŒãã³ãã³ãŒãã§ã¯ã2ã€ã®é åãå®çŸ©ãããŠããŸãã
static wchar_t *g_MethodNames[] = {L"Enable", L"Disable", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadPicture"}; static wchar_t *g_MethodNamesRu[] = {L"", L"", L"", L"", L"", L""};
ããã³ãªã¹ãïŒ
enum Methods { eMethEnable = 0, eMethDisable, eMethShowInStatusLine, eMethStartTimer, eMethStopTimer, eMethLoadPicture, eMethLast // Always last };
ããããã£ã®èª¬æãšåæ§ã«ããããã¯GetNMethods ã FindMethodãããã³GetMethodNameé¢æ°ã§äœ¿çšãããŸãã
GetNParams ã GetParamDefValue ã HasRetValã¡ãœããã¯ãæž¡ããããã©ã¡ãŒã¿ãŒãšã¢ããªã±ãŒã·ã§ã³ããžãã¯ã«å¿ããŠãå¿ èŠãªå€ãè¿ãã¹ã€ãããå®è£ ããŸãã ã³ãŒãå ã®HasRetValã¡ãœããã«ã¯ãçµæãè¿ãããšãã§ããã¡ãœããã®ã¿ã®ãªã¹ãããããŸãã ãããã®å Žåã trueãè¿ããŸã ã ãã¹ãŠã®ééŒæ¹æ³ã«ã€ããŠã falseãè¿ãããŸãã
CallAsProcããã³CallAsFuncã¡ãœããã«ã¯ãçŽæ¥å®è¡å¯èœãªã¡ãœããã³ãŒããå«ãŸããŠããŸãã
é¢æ°ãšããŠã®ã¿åŒã³åºãããšãã§ããã¡ãœãããè¿œå ããã«ã¯ãå€éšã³ã³ããŒãã³ãã®ãœãŒã¹ã³ãŒãã«æ¬¡ã®å€æŽãå ããå¿ èŠããããŸãã
- ã¡ãœããåãg_MethodNamesããã³g_MethodNamesRué åã«è¿œå ããŸã ïŒ AddInNative.cppãã¡ã€ã«ïŒ
- MethodsåæïŒ AddInNative.hãã¡ã€ã«ïŒã«æå³ã®ããã¡ãœããèå¥åãè¿œå ããŸã
- ããã°ã©ã ããžãã¯ã«åŸã£ãŠGetNParamsé¢æ°ã®ã³ãŒããå€æŽããŸãã
- ã¡ãœãããã©ã¡ãŒã¿ã®ããã©ã«ãå€ã䜿çšããå Žåã¯ãå¿ èŠã«å¿ããŠGetParamDefValueã¡ãœããã³ãŒããå€æŽããŸãã
- HasRetValé¢æ°ãå€æŽããŸã
- çŽæ¥å®è¡å¯èœãªã¡ãœããã³ãŒããé 眮ããŠã CallAsProcãŸãã¯CallAsFuncé¢æ°ã®ããžãã¯ãå€æŽããŸãã
次ã«ã g_MethodNamesããã³g_MethodNamesRué å ã Methodsåæã瀺ããŸãã
static wchar_t *g_MethodNames[] = {L"Enable", L"Disable", L"ShowInStatusLine", L"StartTimer", L"StopTimer", L"LoadPicture", L"Test"}; static wchar_t *g_MethodNamesRu[] = {L"", L"", L"", L"", L"", L"", L""};
enum Methods { eMethEnable = 0, eMethDisable, eMethShowInStatusLine, eMethStartTimer, eMethStopTimer, eMethLoadPicture, eMethTest, eMethLast // Always last };
Testã¡ãœããã®ãã©ã¡ãŒã¿ãŒã®æ°ãè¿ãããã«GetNPropsé¢æ°ãç·šéããŠã¿ãŸããã ã
long CAddInNative::GetNParams(const long lMethodNum) { switch(lMethodNum) { case eMethShowInStatusLine: return 1; case eMethLoadPicture: return 1; case eMethTest: return 2; default: return 0; } return 0; }
CAddInNative :: GetParamDefValueé¢æ°ã«å€æŽãå ããŸãããïŒ
bool CAddInNative::GetParamDefValue(const long lMethodNum, const long lParamNum, tVariant *pvarParamDefValue) { TV_VT(pvarParamDefValue)= VTYPE_EMPTY; switch(lMethodNum) { case eMethEnable: case eMethDisable: case eMethShowInStatusLine: case eMethStartTimer: case eMethStopTimer: case eMethTest: // There are no parameter values by default break; default: return false; } return false; }
è¿œå ãããè¡ã®ãããã§
case eMethTest:
1ã€ä»¥äžã®åŒæ°ããªãå Žåã察å¿ãããã©ã¡ãŒã¿ãŒã¯ç©ºã®å€ïŒ VTYPE_EMPTY ïŒã«ãªããŸãã ãã©ã¡ãŒã¿ãŒã®ããã©ã«ãå€ãå¿ èŠãªå Žåã¯ã CAddInNative :: GetParamDefValueé¢æ°ã® switchã¹ããŒãã¡ã³ãã®eMethTestã»ã¯ã·ã§ã³ã§èšå®ããå¿ èŠããããŸã ã
Testã¡ãœããã¯å€ãè¿ãããšãã§ããããã HasRetValé¢æ°ã³ãŒããå€æŽããå¿ èŠããããŸã ã
bool CAddInNative::HasRetVal(const long lMethodNum) { switch(lMethodNum) { case eMethLoadPicture: case eMethTest: return true; default: return false; } return false; }
ãããŠãå®è¡å¯èœãªã¡ãœããã³ãŒããCallAsFuncé¢æ°ã«è¿œå ããŸãã
bool CAddInNative::CallAsFunc(const long lMethodNum, tVariant* pvarRetValue, tVariant* paParams, const long lSizeArray) { ... std::wstring s1, s2; switch(lMethodNum) { case eMethLoadPicture: ... break; case eMethTest: if (!lSizeArray || !paParams) return false; s1 = (paParams) -> pwstrVal; s2 = (paParams+1) -> pwstrVal; wstring_to_p(std::wstring(s1+s2), pvarRetValue); ret = true; break; } return ret; }
ã³ã³ããŒãã³ããã³ã³ãã€ã«ããæ§æã³ãŒãããã©ãŒã ã«è¿œå ããŸãã
; () ("...", "DemoVK", .Native); = ("AddIn.DemoVK.SomeName"); = .(", ", "!"); ();
æ§æãéå§ãããšããHello WorldïŒããšããã¡ãã»ãŒãžã衚瀺ãããŸããããã¯ãã¡ãœãããæ£åžžã«æ©èœããããšã瀺ããŠããŸãã
ã¿ã€ããŒ
ãã£ã¬ã³ãžïŒ
- ãã¢VKã§ã¿ã€ããŒã®å®è£ ãåŠã¶
- ãStartTimerãã¡ãœãããå€æŽãããã©ã¡ãŒã¿ãŒã§ã¿ã€ããŒééïŒããªç§åäœïŒãæž¡ãæ©èœãè¿œå ããŸãã
- è¡ã£ãå€æŽãæ©èœããŠããããšã確èªããŠãã ããã
WinAPIã§ã¯ã WM_TIMERã¡ãã»ãŒãžã䜿çšããŠæéãåŠçã§ããŸãã ãã®ã¡ãã»ãŒãžã¯ãã¿ã€ããŒã®äœææã«èšå®ããæéééã§ããã°ã©ã ã«éä¿¡ãããŸãã
ã¿ã€ããŒãäœæããã«ã¯ã SetTimeré¢æ°ã䜿çšããŸãã
UINT SetTimer(HWND hWnd, // UINT nIDevent, // () UINT nElapse, // TIMERPROC lpTimerFunc); //
ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¯ã nElapseåŒæ°ã§æå®ãããééïŒããªç§åäœïŒã§ããã°ã©ã ã«WM_TIMERã¡ãã»ãŒãžãéä¿¡ããŸãã æåŸã®ãã©ã¡ãŒã¿ãŒã§ã¯ãã¿ã€ããŒãããªã¬ãŒããããã³ã«å®è¡ãããé¢æ°ãæå®ã§ããŸãã ãã®é¢æ°ã®ã¿ã€ãã«ã¯æ¬¡ã®ããã«ãªããŸãïŒååã¯äœã§ãããŸããŸããïŒïŒ
void __stdcall TimerProc (HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
ãã¢VKã®ã¿ã€ããŒå®è£ ãæ€èšããŠãã ããã
Windowsãã¡ããªã®OSçšã®å€éšã³ã³ããŒãã³ãã®éçºããã»ã¹ãæ€èšããŠãããããä»ã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§ã®ã¿ã€ããŒã®å®è£ ã«ã€ããŠã¯æ€èšããŸããã ç¹ã«GNU / Linuxã®å Žåãå®è£ ã¯SetTimerããã³TimerProcé¢æ°ã®æ§æãç°ãªããŸã ã
å®è¡å¯èœã³ãŒãã§ã¯ã SetTimerã¡ãœãããåŒã³åºãã ã MyTimerProcé¢æ°ãæž¡ãããŸãïŒ
m_uiTimer = ::SetTimer(NULL,0,100,(TIMERPROC)MyTimerProc);
äœæãããã¿ã€ããŒã®èå¥åã¯ãåŸã§ç¡å¹ã«ã§ããããã«m_uiTimerå€æ°ã«é 眮ãããŸãã
MyTimerProcé¢æ°ã¯æ¬¡ã®ãšããã§ãã
VOID CALLBACK MyTimerProc( HWND hwnd, // handle of window for timer messages UINT uMsg, // WM_TIMER message UINT idEvent, // timer identifier DWORD dwTime // current system time ) { if (!pAsyncEvent) return; wchar_t *who = L"ComponentNative", *what = L"Timer"; wchar_t *wstime = new wchar_t[TIME_LEN]; if (wstime) { wmemset(wstime, 0, TIME_LEN); ::_ultow(dwTime, wstime, 10); pAsyncEvent->ExternalEvent(who, what, wstime); delete[] wstime; } }
ãã®é¢æ°ã®æ¬è³ªã¯ã ExternalEventã¡ãœãããåŒã³åºããã1CïŒEnterpriseã·ã¹ãã ã«ã¡ãã»ãŒãžãéä¿¡ãããããšã§ãã
StartTimerã¡ãœããã®æ©èœãæ¡åŒµããã«ã¯ã次ã®ã¢ã¯ã·ã§ã³ãå®è¡ããŸãã
GetNParamsã¡ãœããã®ã³ãŒããå€æŽã㊠ã eMethStartTimerã¡ãœããã«å¯ŸããŠ1ãè¿ãããã«ããŸãã
case eMethStartTimer: return 1;
CallAsProcã¡ãœããã®ã³ãŒãããã©ãŒã ã«çµã¿èŸŒã¿ãŸãããïŒ
case eMethStartTimer: if (!lSizeArray || TV_VT(paParams) != VTYPE_I4 || TV_I4(paParams) <= 0) return false; pAsyncEvent = m_iConnect; #ifndef __linux__ m_uiTimer = ::SetTimer(NULL,0,TV_I4(paParams),(TIMERPROC)MyTimerProc); #else // GNU/Linux #endif break;
次ã«ãããã©ãŒãã³ã¹ã確èªããŸãã ãããè¡ãã«ã¯ã管çã¢ããªã±ãŒã·ã§ã³ã®ã¢ãžã¥ãŒã«ã«æ§æçšã®ã³ãŒããèšè¿°ããŸãã
; () ("...", "DemoVK", .Native); = ("AddIn.DemoVK.SomeName"); .(2000);
æ§æãéå§ãããšãããã°ã©ã ã¯2ç§ééã§ã¡ãã»ãŒãžãåä¿¡ããŸããããã¯ãã¿ã€ããŒã®æ£ããåäœã瀺ããŸãã
ã·ã¹ãã ã1CïŒEnterpriseããšã®çžäºäœçš
å€éšã³ã³ããŒãã³ããš1CïŒãšã³ã¿ãŒãã©ã€ãºã·ã¹ãã éã®ããåãã«ã¯ã AddInDefBase.hãã¡ã€ã«ã«èšè¿°ãããŠããIAddInDefBaseã¯ã©ã¹ã®ã¡ãœããã䜿çšãããŸãã æãäžè¬çã«äœ¿çšããããã®ããªã¹ãããŸãã
ãšã©ãŒã¡ãã»ãŒãžã®çæ
virtual bool ADDIN_API AddError(unsigned short wcode, const WCHAR_T* source, const WCHAR_T* descr, long scode)
wcode ã scode-ãšã©ãŒã³ãŒãïŒèª¬æä»ãã®ãšã©ãŒã³ãŒãã®ãªã¹ãã¯ITSãã£ã¹ã¯ã«ãããŸãïŒ
source-ãšã©ãŒã®åå
descr-ãšã©ãŒã®èª¬æ
1CïŒãšã³ã¿ãŒãã©ã€ãºã·ã¹ãã ãžã®ã¡ãã»ãŒãžã®éä¿¡
virtual bool ADDIN_API ExternalEvent(WCHAR_T* wszSource, WCHAR_T* wszMessage, WCHAR_T* wszData) = 0;
wszSource-ã¡ãã»ãŒãžãœãŒã¹
wszMessage-ã¡ãã»ãŒãžããã¹ã
wszData-éä¿¡ããŒã¿
ã¡ãã»ãŒãžååã¯ãå€éšã€ãã³ãåŠçæé ã«ãã£ãŠå®è¡ãããŸã
1Cã®å€éšã³ã³ããŒãã³ãã®ç»é²ïŒãšã³ã¿ãŒãã©ã€ãºã·ã¹ãã
virtual bool ADDIN_API RegisterProfileAs(WCHAR_T* wszProfileName)
wszProfileNameã¯ãã³ã³ããŒãã³ãã®ååã§ãã
ãããã®æ¹æ³ã¯ãVKãš1Cã®å®å šãªçžäºäœçšã«ååã§ãã 1CïŒãšã³ã¿ãŒãã©ã€ãºã·ã¹ãã ããå€éšã³ã³ããŒãã³ãã«ãã£ãŠããŒã¿ãåä¿¡ããã«ã¯ãå€éšã³ã³ããŒãã³ãã¯ç¹å¥ãªã¡ãã»ãŒãžãéä¿¡ããŸãããã®ã¡ãã»ãŒãžã¯1Cã·ã¹ãã ã«ãã£ãŠã€ã³ã¿ãŒã»ãããããå¿ èŠã«å¿ããŠãããŒã¿ãã£ãŒãããã¯ã®ããã«å€éšã³ã³ããŒãã³ãã®ã¡ãœãããåŒã³åºããŸãã
TVariantããŒã¿å
å€éšã³ã³ããŒãã³ããš1CïŒãšã³ã¿ãŒãã©ã€ãºã·ã¹ãã éã§ããŒã¿ã亀æããå ŽåãtVariantããŒã¿ã¿ã€ãã䜿çšãããŸããITSãã©ã€ãã«ããtypes.hãã¡ã€ã«ã§èª¬æãããŠããŸãã
struct _tVariant { _ANONYMOUS_UNION union { int8_t i8Val; int16_t shortVal; int32_t lVal; int intVal; unsigned int uintVal; int64_t llVal; uint8_t ui8Val; uint16_t ushortVal; uint32_t ulVal; uint64_t ullVal; int32_t errCode; long hRes; float fltVal; double dblVal; bool bVal; char chVal; wchar_t wchVal; DATE date; IID IDVal; struct _tVariant *pvarVal; struct tm tmVal; _ANONYMOUS_STRUCT struct { void* pInterfaceVal; IID InterfaceID; } __VARIANT_NAME_2/*iface*/; _ANONYMOUS_STRUCT struct { char* pstrVal; uint32_t strLen; //count of bytes } __VARIANT_NAME_3/*str*/; _ANONYMOUS_STRUCT struct { WCHAR_T* pwstrVal; uint32_t wstrLen; //count of symbol } __VARIANT_NAME_4/*wstr*/; } __VARIANT_NAME_1; uint32_t cbElements; //Dimension for an one-dimensional array in pvarVal TYPEVAR vt; };
ã¿ã€ãtVariantã¯ã次ã®ãã®ãå«ãæ§é ã§ãã
- ããŒã¿ã¹ãã¬ãŒãžãçŽæ¥ç®çãšããæ··åïŒçµåïŒ
- ããŒã¿åèå¥å
äžè¬ã«ãtVariantåã®å€æ°ã®æäœã¯ã次ã®ã¢ã«ãŽãªãºã ã«åŸã£ãŠè¡ãããŸãã
- çŸåšå€æ°ã«æ ŒçŽãããŠããããŒã¿ã®ã¿ã€ããå€å¥ãã
- ããŒã¿ã«çŽæ¥ã¢ã¯ã»ã¹ããããã®ãæ··åç©ã®å¯Ÿå¿ãããã£ãŒã«ããžã®ã¢ã¯ã»ã¹
tVariantã¿ã€ãã䜿çšãããšã1CïŒãšã³ã¿ãŒãã©ã€ãºã·ã¹ãã ãšå€éšã³ã³ããŒãã³ãã®çžäºäœçšãå€§å¹ ã«ç°¡çŽ åãããŸãã
ã¢ããª
examplesãã£ã¬ã¯ããªã«ã¯ãèšäºã®
äŸã®ãµã³ãã«ãå«ãŸããŠããŸã/ 1-ãã¢ã³ã³ããŒãã³ãã®
äŸã®èµ·å/ 2-ããããã£ãªã¹ãã®
äŸã®æ¡åŒµã®ãã¢/ 3-ã¡ãœããã®ãªã¹ãã®æ¡åŒµã®ãã¢
åãã£ã¬ã¯ããªã«ã¯ãVS 2008ãããžã§ã¯ããšæ¢è£œã®1Cæ§æãå«ãŸããŠããŸãã
ã¢ããªãããŠã³ããŒã