web-dev-qa-db-ja.com

libファイルなしでdllをVisual Studioに参照する方法

プロジェクトにサードパーティのライブラリを追加する必要があり、.dllファイルしか提供していません(.libはありません)

Common Properties-> References-> Add New Referenceのプロジェクトプロパティページに移動して、プロジェクトにdllを追加しました

ソリューションエクスプローラーの[External Dependencies]フォルダーの下にdllが表示されるので、正しく含まれていたと思います。

しかし、どうすればDLLを参照できますか?インスタンス変数(たとえば、MCC :: iPort :: ASCII iPort)を追加してdllクラスにアクセスしようとすると、エラーが発生します。クラス名は、External Dependenciesのdll情報で確認できます。

16
Heather

.libファイルなしで裸のDLLにアクセスする唯一の方法は、DLL LoadLibrary()GetProcAddress() でアクセスしたいエクスポートされた関数へのポインタを取得し、次に、それらのポインタを適切な関数シグネチャにキャストします。ライブラリがC++関数をエクスポートする場合、GetProcAddress()に渡す必要がある名前はマングルされます。エクスポートされた名前は でリストできますdumpbin /exports your.dll

extern "C" {
    typedef int (*the_func_ptr)( int param1, float param2 );
}

int main()
{
    auto hdl = LoadLibraryA( "SomeLibrary.dll" );
    if (hdl)
    {
        auto the_func = reinterpret_cast< the_func_ptr >( GetProcAddress( hdl, "the_func" ) );
        if (the_func)
            printf( "%d\n", the_func( 17, 43.7f ) );
        else
            printf( "no function\n" );

        FreeLibrary( hdl );
    }
    else
        printf( "no library\n" );

    return 0;
}

他の人が指摘したように、LIBファイルを作成できます。エクスポートされた関数のリストをdumpbin /exports your.dllから取得します。

ordinal hint RVA      name
      1    0 00001000 adler32
      2    1 00001350 adler32_combine
      3    2 00001510 compress
(etc.)

名前をDEFファイルに入れます。

EXPORTS
adler32
adler32_combine
compress
(etc.)

次に、LIBファイルを作成します。

lib /def:your.def /OUT:your.lib

C++の名前のマングリングまたは32ビットのstdcall呼び出し規約によって名前が装飾されている場合は、報告された名前dumpbin、マングリングなどすべてをコピーして貼り付けます。

34
Khouri Giordano

.libファイルがない場合は、.dllから作成できます。

https://adrianhenke.wordpress.com/2008/12/05/create-lib-file-from-dll/

お役に立てば幸いです。

7
Richard Vu