2

CAPL スクリプトを使用して、サード パーティの dll ファイル内の関数を参照しようとしています。それらを直接呼び出すことができないため、dll の関数をエクスポートするラッパーを作成しようとしています。

int MA_Init(char *TbName, int Option);dll ファイル内の関数です。

これのラッパーコードは

int CAPLEXPORT far CAPLPASCAL CMA_Init(char *TbName, int Option)
{
return MA_Init(*TbName, Option);
}

私は使用しようとしています

HINSTANCE DllHandel = loadlibrary("C:\\Turbo.dll");ライブラリをロードし、

typedef int(*TESTFnptr)(char, int); TESTFnptr fn= (TESTFnptr)getprocaddress(DllHandle, "MA_Init");関数アドレスを解決します。

ただし、コンパイラは、関数"MA_Init()"が定義されていないと言います。正しい手順を使用して dll をビジュアル C++ プロジェクトにロードしているかどうかわかりません。誰かがこれをやろうとしましたか、それがどのように行われたか知っていますか? どうもありがとうございました。

4

1 に答える 1

0

標準的な手順は、対応する.libファイルを VS プロジェクトに含めることです。「プロジェクト - プロパティ - 構成プロパティ - リンカー - 追加の依存関係」に移動turbo.libし、新しい行を追加します。turbo.h次に、関数の定義を含む対応するヘッダー ファイルを含める必要がありますMA_Init

MA_Initこの場合、今と同じように直接電話をかけることができます。コンパイラはMA_Initヘッダー ファイルで の定義を喜んで見つけ、リンカはファイルで への参照を見つけMA_Initます.lib

ファイルがない場合はturbo.h、使用するすべての関数のプロトタイプを知っていれば、自分で作成できます。のような定義を入れるだけです

int MA_Init(char *TbName, int Option);

そこにそれを含めます。

ファイルがない場合は、 およびturbo.libに進む必要がLoadLibraryありGetProcAddressます。MA_Init明らかに、この場合は未定義であるため、名前で呼び出すことはできません。GetProcAddress代わりに、によって返されたポインターを呼び出す必要があります。

TESTFnptr fn = (TESTFnptr)GetProcAddress(DllHandle, "MA_Init");
int CAPLEXPORT far CAPLPASCAL CMA_Init(char *TbName, int Option)
{
    return fn(TbName, Option);
}

PS。TbName?の前の開始を削除したことに注意してください。

PPS。CMA_Initラッパー関数 、 toを含めることを忘れないでくださいCAPL_DLL_INFO_LIST。そうしないと、CANoe/CANalyzer でアクセスできなくなります。

于 2016-02-09T17:42:27.047 に答える