dsound: Disable thread calls and increase refcount in dllmain

Dmitry Timoshkov dmitry at codeweavers.com
Thu Aug 30 08:24:05 CDT 2007


"Maarten Lankhorst" <m.b.lankhorst at gmail.com> wrote:

> Seems native directsound keeps itself loaded by calling LoadLibrary when
> attaching. A simple testcase I wrote confirms that at least for xp, by
> not crashing.

After seeing this, I decided to write my own test, and can confirm now that this
patch looks correct: after a successful LoadLibrary("dsound.dll") FreeLibrary
needs to be called 2 times before it starts to return FALSE.

Just for fun I tested other dlls as well (GetModuleHandle returns 0 for all of them
before the LoadLibrary call):
user32 requires 4 FreeLibrary calls after LoadLibrary, dinput - 1, mfc42 - 1,
advapi32 - 1, comctl32 - 1.

I'm attaching the program I used for testing.

> +        GetModuleFileNameW(hInstDLL, modname, sizeof(modname)/sizeof(*modname));
> +        LoadLibraryW(modname);

Probably simple LoadLibrary("dsound.dll") should be enough.

-- 
Dmitry.
-------------- next part --------------
#include <stdio.h>
#include <windows.h>

int main(int argc, char *argv[])
{
    LONG ref_count;
    HANDLE hLib;

    if(argc != 2)
    {
        printf("Syntax: loaddll.exe library.dll\n");
        return -1;
    }

    hLib = GetModuleHandle(argv[1]);
    printf("existing module %s handle is %p\n", argv[1], hLib);

    printf("Loading %s...", argv[1]);

    hLib = LoadLibrary(argv[1]);

    if (hLib)
    {
        printf("\nLibrary loaded successfully. hLib = %p\n", hLib);

        ref_count = 0;
        while (FreeLibrary(hLib)) ref_count++;
        printf("ref count = %d\n", ref_count);
    }
    else
        printf("\nLoadLibrary() failed. Error %u\n", GetLastError());

    return 0;
}


More information about the wine-devel mailing list