• 9
• 11
• 9
• 20
• 12

# Problem using LPD3DXEFFECT

This topic is 3967 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

I have a class that handles post processing effects in my program. I can access and initialize all of the variables in the class including the LPD3DXEFFECT. However, if I load the effect using D3DXCreateEffectFromFile the program will crash as it is exiting. It is very strange because everything works fine until I exit the program. The error even comes up when I don't release COMs. Here is the error I get:
Quote:
 Unhandled exception at 0x00401e70 in armageddon.exe: 0xC0000005: Access violation reading location 0x00000008.
and the directx debug gives me no information. What is the problem? Thanks

##### Share on other sites
The first thought that springs to mind is a memory leak somewhere but the DX Debug process should tell you that when you exit.

I don't recall seeing that problem with my old Effect Class. And just tested it with DXDebug switched on. It might be more basic than your own but here's what I have in it. Feel free to take a gander in case you spot something you overlooked.

CDXEffect::CDXEffect(LPDIRECT3DDEVICE9 pD3DDevice,LPCTSTR szFileName){	m_pD3DDevice = pD3DDevice;	m_pD3DEffect = NULL;	m_pD3DDefines = NULL;	m_pD3DInclude = NULL;	m_pD3DPool = NULL;	m_pD3DCompileErrors = NULL;	m_dwShaderFlags = NULL;	m_szFileName = szFileName;	m_bCreated = false;}CDXEffect::~CDXEffect(){	m_pD3DDefines = NULL;	m_pD3DInclude = NULL;	m_szFileName = NULL;	m_szTechnique = NULL;	if (m_bCreated)	{		SAFE_RELEASE(m_pD3DCompileErrors);		SAFE_RELEASE(m_pD3DPool);		SAFE_RELEASE(m_pD3DEffect);	}}bool CDXEffect::CreateFromFile(void){		m_dwShaderFlags = D3DXSHADER_DEBUG | D3DXSHADER_SKIPOPTIMIZATION;	HRESULT hr = D3DXCreateEffectFromFile(m_pD3DDevice,m_szFileName,							 m_pD3DDefines,m_pD3DInclude,							 m_dwShaderFlags,m_pD3DPool,							 &m_pD3DEffect,&m_pD3DCompileErrors);	if (hr == D3D_OK) 	{		m_bCreated = true;		return true;	}	if (hr == D3DERR_INVALIDCALL)	{		MessageBox(NULL,"Invalid Call","Create Effect from File",MB_OK);		return false;	}	if (hr == D3DXERR_INVALIDDATA)	{		MessageBox(NULL,"Invalid Data","Create Effect from File",MB_OK);		return false;	}	if (hr == E_OUTOFMEMORY) 	{		MessageBox(NULL,"Out of Memory","Create Effect from File",MB_OK);		return false;	}		if (!m_pD3DEffect) 	{		LPCTSTR buff = (LPCTSTR)m_pD3DCompileErrors->GetBufferPointer();		MessageBox(NULL,buff,"Compiler Errors",MB_OK);		return false;	}	return true;}void CDXEffect::UseTechnique(void){	HRESULT hr = m_pD3DEffect->SetTechnique(m_pD3DEffect->GetTechniqueByName(m_szTechnique));	if (hr == D3D_OK)	{	}	if (hr == D3DERR_INVALIDCALL)	{		MessageBox(NULL,"Invalid Call","UseTechnique",MB_OK);	}}void CDXEffect::SetTechnique(LPCTSTR szTechnique){	m_szTechnique = szTechnique;}UINT CDXEffect::Begin(void){	UINT passes;	HRESULT hr = m_pD3DEffect->Begin(&passes,D3DXFX_DONOTSAVESTATE);	if (hr == D3D_OK) return passes;	if (hr == D3DERR_INVALIDCALL)	{		MessageBox(NULL,"Invalid Call","Begin Effect",MB_OK);		return 0;	}	if (hr == D3DXERR_INVALIDDATA)	{		MessageBox(NULL,"Invalid Data","Begin Effect",MB_OK);		return 0;	}	return 0;}void CDXEffect::BeginPass(UINT pass){	m_pD3DEffect->BeginPass(pass);}void CDXEffect::EndPass(void){	m_pD3DEffect->EndPass();}void CDXEffect::End(void){	m_pD3DEffect->End();}

Good luck. Hope you find the culprit soon.

##### Share on other sites
Now that I took it out of the class I do get a direct-x debug error. In fact I get about 2000 pages of:

Quote:

[lol]

I took the effect and device out of a class and tried to see if it were the class protection that was the problem. It wasn't. So now I'm fairly sure the problem is the way I am loading it. Again, the program works perfectly until it exits. This is the code, maybe an error could be spotted:

BOOL TogglePost(const char *Filename){	HRESULT hr;	//Effect handle	D3DXHANDLE hTech;	if(Filename==NULL)		post = false;	else {		post = true;		DWORD m_dwShaderFlags = 0;				if(FAILED(D3DXCreateEffectFromFile(g_pD3DDevice, Filename, NULL, NULL, m_dwShaderFlags, NULL, &g_pEffect, NULL)))			return FALSE;		//Select technique and store result		if(FAILED(g_pEffect->FindNextValidTechnique(NULL,&hTech)))			return FALSE;		if(FAILED(effectt=g_pEffect->ValidateTechnique(hTech)))			return FALSE;		if(FAILED(effectt=g_pEffect->SetTechnique(hTech)))			return FALSE;	}	return TRUE;}

Thanks!

##### Share on other sites

Quote:
 //Select technique and store resultif(FAILED(g_pEffect->FindNextValidTechnique(NULL,&hTech))) return FALSE;if(FAILED(effectt=g_pEffect->ValidateTechnique(hTech))) return FALSE;if(FAILED(effectt=g_pEffect->SetTechnique(hTech))) return FALSE;

I've never used these commands myself so will have to try it to see what happens in my case.
.. Okay, I added ValidateTechnique to my code and worked a treat. My effect file has multiple techniques in that have to be used specifically so can't use the FindNext option.

Also, what is effectt? it seems to be a variable of some manner but I am not seeing it being initialised, set or used anywhere else in that code. Ah I am guessing it is HRESULT variable.

Another thought I have is maybe try removing the use of the effect file and see if the program falls over using the fixed program functionality. I usually do this if I get a memory error and can't find where the owner of the problem is.

##### Share on other sites
Yeah, I found part of the problem. I had to change m_dwShaderFlags to D3DXSHADER_DEBUG | D3DXSHADER_SKIPOPTIMIZATION.

Now it works fine using the release version of the directx sdk. However, I still get an error in debug mode =/. And I think it still wont work in its own class.