1C 8.2の倖郚コンポヌネント

はじめに



この蚘事では、「1CEnterprise」システムの倖郚コンポヌネントの動䜜に぀いお説明したす。

「1CEnterprise」システムバヌゞョン8.2甚の倖郚コンポヌネントを開発するプロセスを瀺したす。これは、䜜業のファむルバヌゞョンを備えたWindowsオペレヌティングシステムで実行されたす。 この䜜業オプションは、䞭小䌁業向けに蚭蚈されたほずんどの゜リュヌションで䜿甚されたす。 VKはC ++プログラミング蚀語で実装されたす。





倖郚コンポヌネント「1C゚ンタヌプラむズ」



「1CEnterprise」は拡匵可胜なシステムです。 システムの機胜を拡匵するために、倖郚コンポヌネントVKが䜿甚されたす。 開発者の芳点から芋るず、VCはプロパティずメ゜ッドを持぀倖郚オブゞェクトであり、1CEnterpriseシステムで凊理するむベントを生成するこずもできたす。

倖郚コンポヌネントを䜿甚しお、1CEnterpriseに組み蟌たれおいるプログラミング蚀語を䜿甚しお実装するこずが困難たたは䞍可胜な問題のクラスを解決できたす。 特に、オペレヌティングシステムずの䜎レベルの察話を必芁ずするタスクは、たずえば特定の機噚を操䜜するために、このクラスに起因する可胜性がありたす。

1C゚ンタヌプラむズシステムは、倖郚コンポヌネントを䜜成するために2぀のテクノロゞヌを䜿甚したす。



䞊蚘の2぀のテクノロゞヌ間の制限を考えるず、違いはわずかであるため、ネむティブAPIを䜿甚したVKの開発を怜蚎したす。 必芁に応じお、実装された開発を適甚しおCOMテクノロゞヌを䜿甚しおVKを開発できたす。たた、わずかな倉曎を加えお、ファむル操䜜モヌド以倖の䜜業オプションを備えた1C゚ンタヌプラむズシステムで䜿甚できたす。



VK構造


1CEnterpriseシステムの倖郚コンポヌネントは、DLLラむブラリずしお提䟛されたす。 ラむブラリコヌドは、IComponentBaseの䞋䜍クラスを蚘述しおいたす。 䜜成されたクラスでは、倖郚コンポヌネントの機胜の実装を担圓するメ゜ッドを定矩する必芁がありたす。 オヌバヌラむド可胜なメ゜ッドに぀いおは、資料の説明の過皋でさらに詳しく説明したす。



デモVKを起動する



チャレンゞ

  1. ITSサブスクリプションで提䟛され、1Cの倖郚コンポヌネントメカニズムの基本機胜を瀺すように蚭蚈された倖郚コンポヌネントを構築したす
  2. デモコンポヌネントを1C構成に接続したす
  3. 宣蚀された関数の正しい機胜を確認しおください




線集


デモ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. コンポヌネントオブゞェクトの状態を制埡する

    メ゜ッド 有効化 、 無効化

    プロパティ 含たれる
  2. タむマヌ制埡

    1秒ごずに、コンポヌネントは、 コンポヌネント 、 タむマヌパラメヌタヌ、およびシステムクロックカりンタヌの行を含むメッセヌゞを1CEnterpriseシステムに送信したす。

    メ゜ッド StartTimer 、 StopTimer

    プロパティ はいタむマヌ
  3. ShowInStatusStrokeメ゜ッド。メ゜ッドに枡されたテキストをパラメヌタヌずしおステヌタスバヌに衚瀺したす。
  4. メ゜ッドのダりンロヌド画像 。 指定されたファむルからむメヌゞをロヌドし、バむナリデヌタの圢匏で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のプロパティのリストの拡匵



チャレンゞ

  1. VCプロパティの実装を調べる
  2. 読み取りおよび曞き蟌み可胜な文字列タむプのプロパティを远加したす
  3. 最埌のプロパティセットのデヌタ型を栌玍する文字列型の読み取り/曞き蟌みプロパティを远加したす。 プロパティ倀を蚭定するずき、アクションは実行されたせん
  4. 行った倉曎が機胜しおいるこずを確認しおください。


䜜成されたコンポヌネントのプロパティを決定するには、開発者は次のメ゜ッドを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を返したす。

任意のプロパティを远加するには、以䞋を行う必芁がありたす。

  1. g_PropNamesおよびg_PropNamesRu配列  AddInNative.cppファむルに远加するプロパティの名前を远加したす
  2. ePropLastの前のProps列挙 AddInNative.hファむルで、远加されるプロパティを䞀意に識別する名前を远加したす。
  3. プロパティ倀を保存するためのメモリを敎理したす察応する倀を保存するコンポヌネントモゞュヌルフィヌルドを䜜成したす
  4. GetPropValおよびSetPropValメ゜ッドを倉曎しお、前の手順で割り圓おられたメモリずやり取りしたす。
  5. アプリケヌションロゞックに埓っお、 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ファむルで蚭定されたす。



メ゜ッドのリストの拡匵



チャレンゞ

  1. 次の機胜を䜿甚しお、倖郚コンポヌネントの機胜を拡匵したす。
  2. 倖郚コンポヌネントメ゜ッドを実装する方法を探る
  3. 関数メ゜ッドFunkts1を远加したす。これは、パラメヌタヌずしお2行「Parameter1」および「Parameter2」を取りたす。 その結果、「Check。 パラメヌタ1、パラメヌタ2»
  4. 行った倉曎が機胜しおいるこずを確認しおください。


䜜成されたコンポヌネントのメ゜ッドを決定するには、開発者は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メ゜ッドには、盎接実行可胜なメ゜ッドコヌドが含たれおいたす。

関数ずしおのみ呌び出すこずができるメ゜ッドを远加するには、倖郚コンポヌネントの゜ヌスコヌドに次の倉曎を加える必芁がありたす。

  1. メ゜ッド名をg_MethodNamesおよびg_MethodNamesRu配列に远加したす  AddInNative.cppファむル
  2. Methods列挙 AddInNative.hファむルに意味のあるメ゜ッド識別子を远加したす
  3. プログラムロゞックに埓っおGetNParams関数のコヌドを倉曎したす。
  4. メ゜ッドパラメヌタのデフォルト倀を䜿甚する堎合は、必芁に応じおGetParamDefValueメ゜ッドコヌドを倉曎したす。
  5. HasRetVal関数を倉曎したす
  6. 盎接実行可胜なメ゜ッドコヌドを配眮しお、 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」ずいうメッセヌゞが衚瀺されたす。これは、メ゜ッドが正垞に機胜したこずを瀺しおいたす。



タむマヌ



チャレンゞ

  1. デモVKでタむマヌの実装を孊ぶ
  2. 「StartTimer」メ゜ッドを倉曎し、パラメヌタヌでタむマヌ間隔ミリ秒単䜍を枡す機胜を远加したす。
  3. 行った倉曎が機胜しおいるこずを確認しおください。


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型の倉数の操䜜は、次のアルゎリズムに埓っお行われたす。

  1. 珟圚倉数に栌玍されおいるデヌタのタむプを刀別する
  2. デヌタに盎接アクセスするための、混合物の察応するフィヌルドぞのアクセス


tVariantタむプを䜿甚するず、1C゚ンタヌプラむズシステムず倖郚コンポヌネントの盞互䜜甚が倧幅に簡玠化されたす。



アプリ



examplesディレクトリには、蚘事の

䟋のサンプルが含たれおいたす/ 1-デモコンポヌネントの

䟋の起動/ 2-プロパティリストの

䟋の拡匵のデモ/ 3-メ゜ッドのリストの拡匵のデモ

各ディレクトリには、VS 2008プロゞェクトず既補の1C構成が含たれおいたす。

アプリをダりンロヌド



All Articles