سؤال

ماذا يمكن أن يكون سببا؟

من dllmain () على dll_process_attach أنا أتصل بـ idirect3d9 :: createdevice () وهو معلق

الكود واضح ومباشر ، تمامًا مثل:

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    if (ul_reason_for_call = DLL_PROCESS_ATTACH) {
        IDirect3D9* d3d = Direct3DCreate9(D3D_SDK_VERSION);

        D3DPRESENT_PARAMETERS pp = {};
        pp.BackBufferWidth = 1;
        pp.BackBufferHeight = 1;
        pp.BackBufferFormat = D3DFMT_X8R8G8B8;
        pp.BackBufferCount = 1;
        pp.SwapEffect = D3DSWAPEFFECT_DISCARD;
        pp.Windowed = TRUE;

        IDirect3DDevice9* device = NULL;
        HRESULT hr = d3d->CreateDevice(
            D3DADAPTER_DEFAULT, 
            D3DDEVTYPE_HAL, 
            GetDesktopWindow(), 
            D3DCREATE_HARDWARE_VERTEXPROCESSING, 
            &pp, 
            &device);

        device->Release();
        d3d->Release();
    }
    return TRUE;
}

يتم استخدام getDesktopWindow () للبساطة ، وحاولت إنشاء نافذة خاصة واستخدامها ، نفس النتيجة

هل كانت مفيدة؟

المحلول

لا يمكنك فعل هذا النوع من الأشياء في DllMain. على وجه التحديد ، لا يمكنك الاتصال بالوظائف من DLLs الأخرى. يمكنك فقط القيام بذلك من وظيفة مصدرة ، عندما يطلق عليه التطبيق الرئيسي.

اقتباس المستندات على MSDN:

تمسك المواضيع في Dllmain بقفل المحمل بحيث لا يمكن تحميل أو تهيئة DLLs إضافية بشكل ديناميكي.

وظائف الاتصال التي تتطلب DLLs بخلاف kernel32.dll قد تؤدي إلى مشاكل يصعب تشخيصها. على سبيل المثال ، يمكن أن يتسبب استدعاء وظائف المستخدم ، shell ، و com في أخطاء انتهاك الوصول ، لأن بعض الوظائف تقوم بتحميل مكونات النظام الأخرى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top