草庐IT

c - 防止过多的 LoadLibrary/FreeLibrary

coder 2024-06-22 原文

我正在编写一个代理库(称为库 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/

有关c - 防止过多的 LoadLibrary/FreeLibrary的更多相关文章

  1. ruby-on-rails - Rails 3.2 防止使用错误保存对象 - 2

    我有一个ActiveRecord对象,我想在不对模型进行永久验证的情况下阻止它被保存。您过去可以使用errors.add执行类似的操作,但它看起来不再有效了。user=User.lastuser.errors.add:name,"namedoesn'trhymewithorange"user.valid?#=>trueuser.save#=>true或user=User.lastuser.errors.add:base,"myuniqueerror"user.valid?#=>trueuser.save#=>true如何在不修改用户对象模型的情况下防止将用户对象保存在Rails3.2中

  2. ruby - 防止SQL注入(inject)/好的Ruby方法 - 2

    Ruby中防止SQL注入(inject)的好方法是什么? 最佳答案 直接使用ruby?使用准备好的语句:require'mysql'db=Mysql.new('localhost','user','password','database')statement=db.prepare"SELECT*FROMtableWHEREfield=?"statement.execute'value'statement.fetchstatement.close 关于ruby-防止SQL注入(inject

  3. ruby-on-rails - 如何防止错误 "code converter not found (UTF-8)"? - 2

    我在生产环境(CentOS5.6)中遇到此错误,但在开发环境(Ubuntu11.04)中运行良好。在这两种环境中,该应用程序都使用Ruby1.9.3和Rails3.0.9,并由passenger和nginx提供服务。我的Mechanizegem版本是2.3。未找到代码转换器(UTF-8)此代码的最后一行触发它:mech=Mechanize.newpage=mech.get("http://myurl.com/login.php?login_name=a&password=b")form=page.form_with(:name=>"loginForm")form.field_with(

  4. ruby-on-rails - 防止为每个评论调用 upvote 模型 - 2

    我有三个模型:User、Comment和Upvote。User-to-Comment是一对多的关系,Comment-to-Upvote是一对多的关系,而User-to-Upvote是一对多的关系。我想做一些类似于在Stackoverflow上进行投票的事情。因此,当您投赞成票/反对票时,箭头将突出显示并保持突出显示状态,即使您在几天/几周后刷新页面或返回页面也是如此。目前我正在这样做:voted?方法在哪里:defself.voted?(user_id,comment_id)find_by(comment_id:comment_id,user_id:user_id).present?e

  5. ruby - 防止 ruby​​ sinatra 中的 session 固定 - 2

    ruby中的大多数session固定主题都与Rails相关。sinatra中是否存在任何session固定漏洞?在rails中,我们通常建议在分配session之前执行reset_session。我们如何防止sinatra中的session固定? 最佳答案 Sinatra默认使用Rack::Protectiongem来防止许多常见漏洞。您可能对其session劫持保护特别感兴趣。这些是Rack::Protectiongem防止的一些事情:跨站请求伪造真实性token:如果给定的访问token与session中包含的token相匹配,

  6. ruby-on-rails - 防止实例上的 ActiveRecord save() - 2

    我有一个ActiveRecord模型对象Foo;它代表一个标准的数据库行。我希望能够显示该对象实例的修改版本。我想重用类本身,因为它已经具有我需要的所有Hook和方面。(例如:我已经有一个显示适当属性的View)。基本上我想克隆模型实例,修改它的一些属性,并将它反馈给调用者(View、测试等)。我不希望这些属性修改返回到数据库中。但是,我确实希望在克隆版本中包含id属性,因为它可以更轻松地处理路由助手。因此,我计划调用ActiveRecord::Base.clone(),手动设置克隆实例的ID,然后对新实例进行适当的属性更改。不过这让我很担心;修改后的实例上的一个save()和我的原始

  7. ruby - 如何防止将位置参数扩展为关键字参数? - 2

    我想要一个接受散列和可选关键字参数的方法。我尝试定义这样的方法:deffoo_of_thing_plus_amount(thing,amount:10)thing[:foo]+amountend当我使用关键字参数调用此方法时,它按预期工作:my_thing={foo:1,bar:2}foo_of_thing_plus_amount(my_thing,amount:20)#=>21然而,当我省略关键字参数时,散列被吃掉了:foo_of_thing_plus_amount(my_thing)#=>ArgumentError:unknownkeywords:foo,bar如何防止这种情况发生

  8. Ruby/Rails - 如何防止字符转义(或之后转义)? - 2

    我在已经转义的文本文件中有一些json:"{\"嘿\":\"那里\"}"当我尝试读取文件时:File.open("\file\path.txt").read它再次转义内容,因此现在是双重转义:"\"{\\\"嘿\\\":\\\"那里\\\"}\""有没有办法防止转义?或者,是否有一种简单的方法可以在读取和转义后对字符串进行转义?谢谢。编辑:答案是有道理的,但我似乎无法解析JSON。irb(main):018:0>json=>"\"{\\\"hey\\\":\\\"there\\\"}\"\n"irb(main):019:0>putsjson"{\"hey\":\"there\"}"=>

  9. ruby-on-rails - 防止 Rails 2/3 缓存 Lib/Classes - 2

    有谁知道如何指示rails不缓存lib文件夹中包含的类? 最佳答案 “缓存类”我想你的意思是在处理新请求之前,app目录中的源文件会自动重新加载到开发环境中?这与缓存无关,Ruby的正常行为是,只要进程运行,就只读取和解析一次源文件,再也不会。Rails(实际上是ActiveSupport::Dependencies)提供了一种在处理请求之前重新加载整个代码的机制。在开发环境中,这很有用,因为您不想在每次更改代码时都重新启动本地网络服务器。在生产环境中,这会严重损害性能,因此被关闭。默认情况下,应用类被标记为可重新加载。您可以使用u

  10. ruby - 使用 Ruby `return` 时如何防止 `yield` 出现问题 - 2

    正如每个Ruby程序员最终发现的那样,调用包含return语句的block或过程可能很危险,因为这可能会退出您当前的上下文:defsome_method(&_block)puts1yield#Thefollowinglinewillneverbeexecutedinthisexample#astheyieldisactuallya`yield-and-return`.puts3enddeftestsome_methoddoputs2returnendendtest#Thisprints"1\n2\n"insteadof"1\n2\n3\n"如果您想绝对确定某些代码在您调用block或过

随机推荐