簡體   English   中英

創建對象時應用程序崩潰

[英]Application crashes when creating an object

我有一個繼承自IDirectInputA接口的類。

此處: http//pastebin.com/QuHP02ai

因此,當我嘗試創建此對象時,應用程序崩潰(從某處調用CorExitProcess)。 我做錯了什么?

ps直接輸入v。7

pps

此代碼創建對象。 我從其中刪除了一些代碼,除了主要部分

IDirectInputA** ppDI;
HRESULT hr = _DirectInputCreateA(hinst, dwVersion, ppDI, punkOuter);
xDirectInputA xDI = new xDirectInputA((IDirectInputA*)(*ppDI));

創建實例時,您將指針傳遞給IDirectInputA,對嗎? 您通過什么指針? 如果傳遞未初始化或空指針,則將得到未定義的行為。

TBH您正在嘗試做的事情比您想象的要復雜。 問題出在您到底想做什么。 您是要包裝IDirectInputA還是要完全重新實現它。

如果要包裝它,請執行以下操作:

IDirectInputA* pDI = NULL;
HRESULT hr = _DirectInputCreateA( hinst, dwVersion, &pDI, NULL );

然后按如下所示創建派生類:

class xDirectInputA : public IDirectInputA
{
protected:
    IDirectInputA* mpInternal;
public:
    xDirectInputA( IDirectInputA* pInternal ) :
         mpInternal( pInternal )

    HRESULT CreateDevice( REFGUID rguid, IDirectInputDevice** ppDirectInputDevice, IUknown* pOuter )
    {
        // Do what ever processing you need.
        return mpInternal->CreateDevice( rguid, ppDirectInputDevice, pOuter );
    }

    // Implement other functions.
};

現在,您傳遞了xDirectInputA指針,而不是DirectInputCreate返回的普通指針。 現在,您可以攔截通過該類的每條消息。

如果您嘗試完全重新實現,則要復雜得多。 您將需要完全實現COM對象。 最好將DInput.DLL放在包含您的實現的可執行文件旁邊。 總之,如果您真的知道自己在做什么,則應該嘗試一下。

如果您想全面學習COM,建議您購買Don Box的Essential COM 這是非常有幫助的書。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM