一家公司生产带有以太网连接器的设备。我有他们的一个设备,他们给了我一个 .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();
...
}
我希望我已经添加了所有相关的代码部分。如果您需要更多信息,请告诉我!