2017-01-29 9 views
1

カスタムCodeInsightマネージャをC++ Builder 10.1.2 Berlinに登録しようとしています。初期化/終了セクションなしでカスタムCodeInsightマネージャをC++ Builderに登録する

例えばC++、パスカルでのinitializationfinalizationセクションオブジェクトのようなものは何もありませんので

var 
    codeManagerIndex: Integer; 

{...} 

initialization 
    codeManagerIndex := (BorlandIDEServices as IOTACodeInsightServices).AddCodeInsightManager(TMyCodeInsightManager.Create); 

finalization 
    (borlandIDEServices as IOTACodeInsightServices).RemoveCodeInsightManager(codeManagerIndex); 
end. 

私は、コンストラクタ/デストラクタを持つカスタムrunnerクラスで自分の行動を再現しようとした:

class Runner 
{ 
public: 
    int FCodeManagerIndex; 

    _di_IOTACodeInsightServices CIS; 

    Runner() { 
     if (BorlandIDEServices->Supports(CIS)) 
      FCodeManagerIndex = CIS->AddCodeInsightManager(new TMyCodeInsightManager); 
    } 

    ~Runner() { 
     if (BorlandIDEServices->Supports(CIS)) 
      CIS->RemoveCodeInsightManager(FCodeManagerIndex); 
    } 
}; 


#pragma argsused 
extern "C" int _libmain(unsigned long reason) 
{ 
    Runner Run; 
    return 1; 
} 

私は私の単純な実装をコンパイルすることができますが、私は次のことが起こっているパッケージをインストールしようとすると:

  • 第一試み:エラーメッセージ:がパッケージを読み込むことができません... mypackage.bpl - ダイナミックリットルインクライブラリ(DLL)の初期化ルーチンが失敗しました。

  • 第二試み:例外(C0000005)モジュールにDllEntryPointまたはDllMainの間に発生しました:... mypackage.bpl ...その後、IDEがクラッシュします。

これは登録に間違った方法ですか? ここで何が間違っていますか?

P.S. [TLIB警告]警告:ライブラリがページサイズには大きすぎ、ページサイズ32で再構築されましたが、コンパイル時に警告が表示されますが、これが私のエラーの理由ではないと確信しています。 (?)

+0

これはクラスのコンストラクタでは行いません。次に、静的変数を宣言します。コンストラクタは起動時に実行されます。 –

答えて

3

をCでパスカルのinitializationfinalizationセクション++

オブジェクトのようなものは何も実際には、そこにあるんです。 C++ Builderでは、ユーザー定義関数を実行するために#pragma startup and #pragma exitを使用することができます。

static int FCodeManagerIndex = -1;  

void DoRegister() { 
    _di_IOTACodeInsightServices CIS; 
    if (BorlandIDEServices->Supports(CIS)) { 
     FCodeManagerIndex = CIS->AddCodeInsightManager(new TMyCodeInsightManager);   
    } 
} 
#pragma startup DoRegister 

void DoUnregister() { 
    _di_IOTACodeInsightServices CIS; 
    if ((FCodeManagerIndex != -1) && BorlandIDEServices->Supports(CIS)) { 
     CIS->RemoveCodeInsightManager(FCodeManagerIndex); 
    } 
} 
#pragma exit DoUnregister 

#pragma argsused 
extern "C" int _libmain(unsigned long reason) 
{ 
    return 1; 
} 

を別の方法として、あなたは準備ができてクラスを宣言したので、あなたの登録を処理するために、あなたは、単にグローバルスタティックメモリにあなたのクラス変数を移動することができますそうそのコンストラクタは、起動時に実行され、デストラクタは、シャットダウン時に実行されます。変数がスコープ外とき_libmain()終了し、これunregisteri行くときデストラクタが呼び出されますので、無用である_libmain()の内側

class Runner 
{ 
public: 
    int FCodeManagerIndex; 

    Runner() : FCodeManagerIndex(-1) { 
     _di_IOTACodeInsightServices CIS; 
     if (BorlandIDEServices->Supports(CIS)) { 
      FCodeManagerIndex = CIS->AddCodeInsightManager(new TMyCodeInsightManager); 
     } 
    } 

    ~Runner() { 
     _di_IOTACodeInsightServices CIS; 
     if ((FCodeManagerIndex != -1) && BorlandIDEServices->Supports(CIS)) { 
      CIS->RemoveCodeInsightManager(FCodeManagerIndex); 
     } 
    } 
}; 

static Runner Run; 

#pragma argsused 
extern "C" int _libmain(unsigned long reason) 
{ 
    return 1; 
} 

は、クラス変数の宣言します登録した直後にマネージャを登録してください。したがって、変数は、パッケージがメモリにロードされている間は生き残る必要があります。

+0

おかげさまで、レミー。 – FlKo

+0

ここに[フォローアップの質問](http://stackoverflow.com/questions/41932738/registering-a-custom-codeinsight-manager-what-am-i-doing-wrong)です。 – FlKo

関連する問題