gpt4 book ai didi

c - 防止过多的 LoadLibrary/FreeLibrary

转载 作者:可可西里 更新时间:2023-11-01 12:08:02 25 4
gpt4 key购买 nike

我正在编写一个代理库(称为库 A),它只是与系统上可能存在或不存在的另一个 DLL(称为库 B)的接口(interface)。这个想法是程序将链接到这个库 A 而不是原始库 B ;如果系统上没有安装库 B,库 A 将处理错误。

所以一个典型的代理函数看起来像这样:

int function(int arg1, int arg2)
{
HINSTANCE hinstLib;
UINT errormode = SetErrorMode(SEM_FAILCRITICALERRORS);
SetErrorMode(errormode | SEM_FAILCRITICALERRORS);
hinstLib = LoadLibrary(TEXT(ORIGINAL_DLL));
SetErrorMode (errormode);
if (hinstLib != NULL)
{
ProcAdd = (void *) GetProcAddress(hinstLib, TEXT("function"));
if (NULL != ProcAdd)
{
return (ProcAdd) (arg1, arg2);
}
FreeLibrary(hinstLib);
}
return ERROR;
}

现在,我会对图书馆 B 中的所有原始条目执行此操作。可能会有很多调用。因此,如此频繁地加载/卸载 DLL 肯定会对速度产生影响。

我想知道使用全局变量 hinstLib 是否可以接受;像

HINSTANCE hinstLib = LoadLibrary(TEXT(ORIGINAL_DLL));

int function(int arg1, int arg2)
{
if (hinstLib != NULL)
{
ProcAdd = (void *) GetProcAddress(hinstLib, TEXT("function"));
if (NULL != ProcAdd)
{
return (ProcAdd) (arg1, arg2);
}
}
return ERROR;
}

并让 Windows 在程序退出时自动卸载 DLL(假设它确实卸载了它)。

预先感谢您的明智评论...

让-伊夫

最佳答案

除非卸载是特定的用例,否则这很好。但是我会实现一些线程安全,以确保通过使用 Critical Section 的这段代码没有竞争条件。 .

这与维基百科文章中的例子相似

    /* Sample C/C++, Windows, link to kernel32.dll */
#include <windows.h>

static CRITICAL_SECTION cs;

static HINSTANCE hinstLib = LoadLibrary(TEXT(ORIGINAL_DLL));

/* Initialize the critical section before entering multi-threaded context. */
InitializeCriticalSection(&cs);

void f() {
/* Enter the critical section -- other threads are locked out */
__try {
EnterCriticalSection(&cs);

if (hinstLib != NULL) {
ProcAdd = (void *) GetProcAddress(hinstLib, TEXT("function"));
} __finally {
LeaveCriticalSection(&cs);
}
if (NULL != ProcAdd) {
return (ProcAdd) (arg1, arg2);
}
}

.
.
.

/* Release system object when all finished -- usually at the end of the cleanup code */
DeleteCriticalSection(&cs);

关于c - 防止过多的 LoadLibrary/FreeLibrary,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3845135/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com