Delphiで書かれたジェネリックスを使用している関数をC++Builder XE3から呼び出すと例外が発生する問題と回避策について

概要

Delphiで書かれたジェネリックスを使用している関数をC++Builderから呼び出すと例外が発生します。

動作環境

C++Builder XE3で確認しました。
(もしかしたら、私の環境だけで発生する問題かもしれません。)

再現方法

  1. メニューから「新規作成」→「VCL フォームアプリケーション」を選択します。

  2. プロジェクトに次のUnit2.pasを追加します。

    unit Unit2;
    
    interface
    
    procedure Func;
    
    implementation
    
    uses System.Generics.Collections;
    
    procedure Func;
    var
      L: TList<Integer>;
    begin
      L := TList<Integer>.Create;
    end;
    
    end.
    
  3. Unit1.cppに次のコードを追加します。
    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    #include "Unit2.hpp" //追加
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
      : TForm(Owner)
    {
      Func(); //追加
    }
    //---------------------------------------------------------------------------
    
  4. プロジェクトをビルドして、実行します。

    Func()のところで例外が発生します。

    01

    02

回避策

プロジェクトオプションで「実行時パッケージを使ってリンク」が「true」になっていると、この例外が発生するようです。

03

「false」にすると発生しませんでした。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください