PeekMessage C ++ 64-разрядный - PullRequest
       30

PeekMessage C ++ 64-разрядный

1 голос
/ 13 февраля 2012

Я использую следующий код в моей функции WinMain:

// Main message loop:
bool noQuit = true;
while (noQuit)
{
    if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);

        if (msg.message == WM_QUIT)
            noQuit = false;
    }
    else
    {
        DrawFrame();
    }
}

Это прекрасно работает, когда я компилирую с 32-битной (Win32) платформой. На 64-битной (x64) платформе код компилируется нормально, но когда я его запускаю, он вылетает. С помощью отладчика я обнаружил, что он выдает ошибку с нарушением прав доступа в строке PeekMessage. Это происходит только с 64-битной, поэтому мне интересно, почему это так? Есть ли что-то, что я делаю неправильно, или что-то, что я должен знать о 64-битной версии, что я делаю неправильно?

Я нахожу это действительно странным, потому что он не всегда выдает ошибку на первом шаге этого цикла, иногда это 2-й или даже 3-й раз, но он всегда останавливается на строке PeekMessage с тем же нарушением доступа.

Пожалуйста, прокомментируйте, если для меня было бы полезно опубликовать больше кода, чем просто эту часть (хотя я на 99% уверен, что здесь происходит ошибка).

Спасибо!

EDIT Вот конструктор для класса, который обращается к флэш-ocx ....

CFlashDXPlayer::CFlashDXPlayer(HMODULE flashDLL, unsigned int width, unsigned int height)
{
m_userData = NULL;
m_flashInterface = NULL;
m_oleObject = NULL;
m_windowlessObject = NULL;
m_lastMouseX = 0;
m_lastMouseY = 0;
m_lastMouseButtons = 0;

m_dirtyFlag = false;

m_width = width;
m_height = height;

m_controlSite.Init(this);
m_controlSite.AddRef();

m_alphaBlackDC = NULL;
m_alphaBlackBitmap = NULL;
m_alphaBlackBuffer = NULL;
m_alphaWhiteDC = NULL;
m_alphaWhiteBitmap = NULL;
m_alphaWhiteBuffer = NULL;

HRESULT hr;

typedef HRESULT (__stdcall *DllGetClassObjectFunc)(REFCLSID rclsid, REFIID riid, LPVOID * ppv);

if (flashDLL != NULL)
{
    IClassFactory* aClassFactory = NULL;
    DllGetClassObjectFunc aDllGetClassObjectFunc = (DllGetClassObjectFunc) GetProcAddress(flashDLL, "DllGetClassObject");
    hr = aDllGetClassObjectFunc(CLSID_ShockwaveFlash, IID_IClassFactory, (void**)&aClassFactory);

    if (FAILED(hr))
        return;

    aClassFactory->CreateInstance(NULL, IID_IOleObject, (void**)&m_oleObject);
    aClassFactory->Release();   
}
else
{
    hr = CoCreateInstance(CLSID_ShockwaveFlash, NULL, CLSCTX_INPROC_SERVER, IID_IOleObject, (void**)&m_oleObject);

    if (FAILED(hr))
        return;
}

IOleClientSite* pClientSite = NULL;
hr = m_controlSite.QueryInterface(__uuidof(IOleClientSite), (void**)&pClientSite);
if (FAILED(hr))
    return;

hr = m_oleObject->SetClientSite(pClientSite);
if (FAILED(hr))
    return;

hr = m_oleObject->QueryInterface(__uuidof(IShockwaveFlash), (void**)&m_flashInterface);
if (FAILED(hr))
    return;

m_flashInterface->DisableLocalSecurity();
m_flashInterface->PutEmbedMovie(FALSE);
m_flashInterface->PutAllowScriptAccess(L"always");
SetTransparencyMode(IFlashDXPlayer::TMODE_OPAQUE);
SetQuality(IFlashDXPlayer::QUALITY_HIGH);

hr = m_oleObject->DoVerb(OLEIVERB_INPLACEACTIVATE, NULL, pClientSite, 0, NULL, NULL);
assert(SUCCEEDED(hr));

pClientSite->Release();

hr = m_oleObject->QueryInterface(__uuidof(IOleInPlaceObjectWindowless), (void**)&m_windowlessObject);
assert(SUCCEEDED(hr));

m_flashSink.Init(this);
m_flashSink.AddRef();

// Resize player
ResizePlayer(width, height);
}

и то, что передается во flashDLL, это m_FlashLibHandle, где

m_flashLibHandle = LoadLibrary(L"Flash11e.ocx");
...