1

ある会社は、イーサネット コネクタを備えたデバイスを製造しています。私は彼らのデバイスの 1 つを持っており、.lib ファイルといくつかの .h ファイルを提供してくれたので、彼らのデバイスに接続して通信することができます。うまくいきました。満足しています。その後、同社は新しいバージョンのデバイスを製造しました。私はこの新しいデバイスも持っており、接続して通信できるようにいくつかのファイルを提供してくれました。今回は.libファイル、.dllファイル、およびいくつかの.hファイルです。

背景はこれで終わりです。さて、問題:

MS Visual C++ 6.0 で簡単なテスト アプリケーションを作成して、古いインターフェイスを使用して新しいデバイスに接続しようとしたときに何が起こるかを確認しました。接続)。理にかなっています、同意します!しかし、その .lib ファイルを .dll ファイルにラップして同じシナリオを再試行すると、すぐに結果が得られず、0 の結果が得られるまで 42 秒かかります! 古いデバイスに接続しようとすると、ラッパーは問題なく動作します。まったく問題ありません。

これは、.lib ファイルを .dll ファイルにラップする必要がある最初のプロジェクトです (C# で使用できるようにするため、これを行いました)、このトピックについてはあまり知りません。私が知っているのは、元のメソッド呼び出しからラッパーへの値を渡しているということだけです...どうすればこのような遅延が発生するのでしょうか? ラッピングのどこかで起こっているに違いないが、私には手がかりがない. ラッパーがなくてもすぐに結果が得られるため、ネットワーキングは問題になりません。スレッディングやDLLについて何か?

私は誰かがここで私を啓発できることを望んでいました...

ここで何が関連するかわからないため、特定のコードは投稿しませんでした。さらに詳しい情報が必要な場合は、お知らせください。

編集: C# にはクラス MyDLLImport があります:

class MyDLLImport
{
    [DllImport("Old_Interface_MSVC++GeneratedDLL.dll")]
    public static extern int Connect();

    [DllImport("Old_Interface_MSVC++GeneratedDLL.dll")]
    public static extern int Disconnect();

    ...
}

別の C# クラスでは、次のようにこれらのメソッドに直接アクセスします。

MyDLLImport.Connect();

Old_Interface_MSVC++GeneratedDLL.dll ファイルにまとめた .lib および .h ファイルは次のようになります。

Old_Interface_MSVC++GeneratedDLL.cpp:

#include "stdafx.h"
#include "Old_Interface_MSVC++GeneratedDLL_Class.h"
#include "Old_Interface_MSVC++GeneratedDLL.h"
#include <string.h>
#include <iostream>

BOOL APIENTRY DllMain( HANDLE hModule, 
        DWORD  ul_reason_for_call, 
        LPVOID lpReserved
    )
{
    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}

ALibClass MyDLL::client;

int MyDLL::Connect()
{
    int ret;

    ret = MyDLL::client.Connect();
    if(!ret)
    {
        std::cerr << "Could not connect" << std::endl;
        return false;
    }

    return true;
}

void MyDLL::Disconnect()
{
    MyDLL::client.Disconnect();
}

...

/////////////////////////////////
// exported functions

int Connect()
{
    return MyDLL::Connect();
}

void Disconnect()
{
    MyDLL::Disconnect();
}

次に、以前の .cpp ファイルのヘッダー ファイル Old_Interface_MSVC++GeneratedDLL.h があります。

#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif

// added by myself to prevent export warnings
#pragma warning( disable: 4251 )

/////////////////////////////////////////////
//exported general methods
extern "C" MYDLL_API int Connect();
extern "C" MYDLL_API void Disconnect();

...

最後に、クラス ヘッダー ファイル Old_Interface_MSVC++GeneratedDLL_Class.h:

#include "lib_header_file.h"

class MyDLL
{
private:
    static ALibClass client;

public:
    static int Connect();
    static void Disconnect();

    ...
}

関連するすべてのコード部分を追加したことを願っています。さらに情報が必要な場合は、お知らせください。

4

0 に答える 0