0

我有这个回调函数:

if (FAILED(hr = g_lpDIDeviceJoystick->EnumEffectsInFile(FileConvert, EnumAndCreateEffectsCallback, NULL, DIFEF_INCLUDENONSTANDARD)))
    return hr;


BOOL CALLBACK FFBack::EnumAndCreateEffectsCallback(LPCDIFILEEFFECT pDIFileEffect, VOID* pvRef)
{
    STRUCT_EFFECTINFO EffectInfo;

    EffectInfo.GuidEffect = pDIFileEffect->GuidEffect;
    EffectInfo.lpDiEffect = pDIFileEffect->lpDiEffect;

    VectEffectInfo.push_back(EffectInfo);

    return DIENUM_STOP;
}


// Create all effect from vector
if (VectEffectInfo.size()>0)
    for (int i=0;i< VectEffectInfo.size();i++)
        if (FAILED(hr = g_lpDIDeviceJoystick->CreateEffect(VectEffectInfo[i].GuidEffect, VectEffectInfo[i].lpDiEffect, &g_lpdiEffect, NULL)))
            return hr;

问题是静态向量“VectEffectInfo”在退出函数“EnumAndCreateEffectsCallback”后不保留“lpDiEffect”的值,因为这是指针。

该向量在类内的文件 ForceFeedback.h (public) 中声明为静态:

class FFBack
{

public:


    struct STRUCT_DEVICEINFO
    {
        GUID guidInstance;
        std::string tszProductName;
    };

    struct STRUCT_EFFECTINFO
    {
        GUID GuidEffect;
        LPCDIEFFECT lpDiEffect;
    };

    static vector<STRUCT_EFFECTINFO> VectEffectInfo;

退出此函数后,“lpDiEffect”值将自动更改,不幸的是,向量也会更改(因为向量指向指针)。

所以我需要一种简单的方法来保留'pDIFileEffect->lpDiEffect'的静态副本,我可以在这个函数'EnumAndCreateEffectsCallback'之外使用它,就像我的例子一样。

所以我在这种情况下使用了一个向量,但我不确定是否有必要,因为该函数似乎只调用一次(每次只返回一行的向量)。

这里是完整的功能:

BOOL CALLBACK FFBack::EnumAndCreateEffectsCallback(LPCDIFILEEFFECT pDIFileEffect, VOID* pvRef)
{
    STRUCT_EFFECTINFO EffectInfo;

    EffectInfo.GuidEffect = pDIFileEffect->GuidEffect;
    EffectInfo.lpDiEffect = pDIFileEffect->lpDiEffect;

    VectEffectInfo.push_back(EffectInfo);

    return DIENUM_STOP;
}



    HRESULT FFBack::PlayFileEffect(int Gain, std::wstring FileName) {
      LPCWSTR FileConvert = FileName.c_str();
    
      HRESULT hr;
    
      VectEffectInfo.clear();
    
      LF::Log_Update("init", true);
    
      // Assign all file effect to a vector
      if (FAILED(hr = g_lpDIDeviceJoystick -> EnumEffectsInFile(FileConvert, EnumAndCreateEffectsCallback, NULL, DIFEF_INCLUDENONSTANDARD)))
        return hr;
    
      if (VectEffectInfo.size() > 0)
        for (int i = 0; i < VectEffectInfo.size(); i++)
          if (FAILED(hr = g_lpDIDeviceJoystick -> CreateEffect(VectEffectInfo[i].GuidEffect, VectEffectInfo[i].lpDiEffect, & g_lpdiEffect, NULL)))
            return hr;
    
      if (FAILED(hr = g_lpdiEffect -> Start(1, 0)))
        return hr;
    }

经过调试的小分析后,我可以确认在函数“EnumAndCreateEffectsCallback”内部:VectEffectInfo[0].lpDiEffect 的值是正确的。在函数之外,VectEffectInfo[0].lpDiEffect 的值发生了更改且不正确,并且方法“g_lpDIDeviceJoystick->CreateEffect”返回错误。

你能帮我吗 ?

4

0 回答 0