1

一家公司生产带有以太网连接器的设备。我有他们的一个设备,他们给了我一个 .lib 文件和一些 .h 文件,这样我就可以与他们的设备连接和通信。工作正常,我很高兴。然后该公司生产了他们设备的新版本。我也有这个较新的设备,他们再次给了我一些文件,以便我可以连接并与之通信:这次是一个 .lib 文件、一个 .dll 文件和一些 .h 文件。

这么多的背景。现在,问题:

我在 MS Visual C++ 6.0 中编写了一个简单的测试应用程序,看看会发生什么,当我尝试使用旧接口连接到新设备时:提供的 connect() 方法(使用旧的 .lib 文件)立即返回 0(不能连接)。有道理,我同意!但是,当我将 .lib 文件包装在 .dll 文件中并再次尝试相同的场景时,我没有立即得到结果,需要 42 秒才能得到 0 结果!当我尝试连接到旧设备时,包装器工作正常,完全没有问题。

这是我必须将 .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