我有这个回调函数:
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”返回错误。
你能帮我吗 ?