windows-nt/Source/XPSP1/NT/multimedia/directx/dxvb/dx8vb/dxglob7obj.cpp

979 lines
23 KiB
C++
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1998 - 1999
//
// File: dxglob7obj.cpp
//
//--------------------------------------------------------------------------
#include "windows.h"
#include "mmsystem.h"
#include "stdafx.h"
#include "d3d8.h"
#include "d3dx8.h"
#include "Direct.h"
#include "dms.h"
#include "math.h"
#include "dxGlob7Obj.h"
#include "dmusici.h"
#include "dmusicf.h"
#include "dvoice.h"
#include "dxfile.h"
#include "dsoundObj.h"
#include "dsoundCaptureObj.h"
#include "DSEnumObj.h"
#include "DPlayPeerObj.h"
#include "DPlayServerObj.h"
#include "DPlayClientObj.h"
#include "DPlayLobbyClientObj.h"
#include "DPlayLobbiedAppObj.h"
#include "DPlayVoiceClientObj.h"
#include "DPlayVoiceServerObj.h"
#include "DPlayVoiceSetupObj.h"
#include "DPlayAddressObj.h"
#include "dinput1Obj.h"
#include "dmSegmentObj.h"
#include "dmSegmentStateObj.h"
#include "dmChordMapObj.h"
#include "dmBandObj.h"
#include "dmCollectionObj.h"
#include "dmStyleObj.h"
#include "dmPerformanceObj.h"
#include "dmLoaderObj.h"
#include "dmComposerObj.h"
#include "xfileobj.h"
#include "verinfo.h"
extern HINSTANCE g_hDSoundHandle;
extern HINSTANCE g_hDPlay;
extern HINSTANCE g_hInstDINPUTDLL;
extern HINSTANCE g_hInst;
extern HINSTANCE g_hD3D8;
extern HRESULT BSTRtoPPGUID(LPGUID*,BSTR);
extern HRESULT BSTRtoGUID(LPGUID,BSTR);
extern void *g_dxj_DirectMusic;
extern void *g_dxj_DirectMusicLoader;
extern void *g_dxj_DirectMusicComposer;
extern void *g_dxj_DirectMusicPerformance;
extern void *g_dxj_DirectPlay;
extern void *g_dxj_DirectPlayPeer;
extern void *g_dxj_DirectPlayLobbyClient;
extern void *g_dxj_DirectPlayLobbiedApplication;
extern void *g_dxj_DirectPlayServer;
extern void *g_dxj_DirectPlayClient;
extern void *g_dxj_DirectPlayAddress;
extern BSTR GUIDtoBSTR(LPGUID);
extern HRESULT DPLBSTRtoGUID(LPGUID pGuid,BSTR str);
extern HINSTANCE LoadD3D8DLL();
extern HINSTANCE LoadD3DXOFDLL();
extern HINSTANCE LoadDPlayDLL();
extern HINSTANCE LoadDSoundDLL();
extern HINSTANCE LoadDINPUTDLL();
DWORD WINAPI ThreadFunc(LPVOID param);
#ifndef DX_FINAL_RELEASE
// shut 'em down if they try to use the beta bits too long
HRESULT TimeBomb()
{
#pragma message("BETA EXPIRATION TIME BOMB! Remove for final build!")
SYSTEMTIME st;
GetSystemTime(&st);
if ( st.wYear > DX_EXPIRE_YEAR ||
((st.wYear == DX_EXPIRE_YEAR) && (MAKELONG(st.wDay, st.wMonth) > MAKELONG(DX_EXPIRE_DAY, DX_EXPIRE_MONTH)))
) {
MessageBox(0, DX_EXPIRE_TEXT,
TEXT("Microsoft DirectX For Visual Basic"), MB_OK);
return S_OK;// let it work anyway.
}
return S_OK;
} // TimeBomb
#endif
C_dxj_DirectX7Object::C_dxj_DirectX7Object(){
m_pDirectSoundCreate=NULL;
m_pDirectSoundEnumerate=NULL;
m_pDirectSoundCaptureEnumerate=NULL;
m_pDirectSoundCaptureCreate=NULL;
m_pDirect3DCreate8=NULL;
m_pEventList=NULL;
}
void C_dxj_DirectX7Object::LoadDSOUND()
{
if (!g_hDSoundHandle ) LoadDSoundDLL();
if (!m_pDirectSoundCreate) m_pDirectSoundCreate = (DSOUNDCREATE)GetProcAddress( g_hDSoundHandle, "DirectSoundCreate8" );
if (!m_pDirectSoundCaptureCreate) m_pDirectSoundCaptureCreate = (DSOUNDCAPTURECREATE)GetProcAddress( g_hDSoundHandle, "DirectSoundCaptureCreate" );
if (!m_pDirectSoundEnumerate) m_pDirectSoundEnumerate = (DSOUNDENUMERATE)GetProcAddress( g_hDSoundHandle, "DirectSoundEnumerateA" );
if (!m_pDirectSoundCaptureEnumerate) m_pDirectSoundCaptureEnumerate = (DSOUNDCAPTUREENUMERATE)GetProcAddress( g_hDSoundHandle, "DirectSoundCaptureEnumerateA" );
}
void C_dxj_DirectX7Object::LoadD3D8()
{
if (!g_hD3D8 ) LoadD3D8DLL();
if (!m_pDirect3DCreate8) m_pDirect3DCreate8 = (D3DCREATE8)GetProcAddress( g_hD3D8, "Direct3DCreate8" );
}
C_dxj_DirectX7Object::~C_dxj_DirectX7Object()
{
DWORD i=1;
while (m_pEventList) {
#ifdef _WIN64
destroyEvent((HANDLE)m_pEventList->hEvent);
#else
destroyEvent((LONG)PtrToLong(m_pEventList->hEvent));
#endif
}
}
STDMETHODIMP C_dxj_DirectX7Object::DirectPlayVoiceClientCreate(I_dxj_DirectPlayVoiceClient **ret){
HRESULT hr;
LPDIRECTPLAYVOICECLIENT realvoice=NULL;
DWORD i=0;
#ifndef DX_FINAL_RELEASE
hr = TimeBomb();
if (FAILED(hr))
{
return E_FAIL;
}
#endif
if( FAILED(hr = CoCreateInstance(CLSID_DirectPlayVoiceClient,NULL,
CLSCTX_INPROC_SERVER,
IID_IDirectPlayVoiceClient,
(LPVOID*) &realvoice)))
return hr;
INTERNAL_CREATE_ADDRESS(_dxj_DirectPlayVoiceClient,realvoice,ret);
if (*ret==NULL) {
i=realvoice->Release();
return E_FAIL;
}
return hr;
}
STDMETHODIMP C_dxj_DirectX7Object::DirectPlayLobbyClientCreate(I_dxj_DirectPlayLobbyClient **ret) {
HRESULT hr;
IDirectPlay8LobbyClient *realLC=NULL;
#ifndef DX_FINAL_RELEASE
hr = TimeBomb();
if (FAILED(hr))
{
return E_FAIL;
}
#endif
if( FAILED(hr = CoCreateInstance(CLSID_DirectPlay8LobbyClient,NULL,
CLSCTX_INPROC_SERVER,
IID_IDirectPlay8LobbyClient,
(void**) &realLC)))
return hr;
INTERNAL_CREATE_ADDRESS(_dxj_DirectPlayLobbyClient,realLC,ret);
if (*ret==NULL) {
realLC->Release();
return E_FAIL;
}
return hr;
}
STDMETHODIMP C_dxj_DirectX7Object::DirectPlayLobbiedApplicationCreate(I_dxj_DirectPlayLobbiedApplication **ret) {
HRESULT hr;
IDirectPlay8LobbiedApplication *realLA=NULL;
#ifndef DX_FINAL_RELEASE
hr = TimeBomb();
if (FAILED(hr))
{
return E_FAIL;
}
#endif
if( FAILED(hr = CoCreateInstance(CLSID_DirectPlay8LobbiedApplication,NULL,
CLSCTX_INPROC_SERVER,
IID_IDirectPlay8LobbiedApplication,
(void**) &realLA)))
return hr;
INTERNAL_CREATE_ADDRESS(_dxj_DirectPlayLobbiedApplication,realLA,ret);
if (*ret==NULL) {
realLA->Release();
return E_FAIL;
}
return hr;
}
STDMETHODIMP C_dxj_DirectX7Object::DirectPlayVoiceServerCreate(I_dxj_DirectPlayVoiceServer **ret){
HRESULT hr;
LPDIRECTPLAYVOICESERVER realvoice=NULL;
DWORD i=0;
#ifndef DX_FINAL_RELEASE
hr = TimeBomb();
if (FAILED(hr))
{
return E_FAIL;
}
#endif
if( FAILED(hr = CoCreateInstance(CLSID_DirectPlayVoiceServer,NULL,
CLSCTX_INPROC_SERVER,
IID_IDirectPlayVoiceServer,
(LPVOID*) &realvoice)))
return hr;
INTERNAL_CREATE_ADDRESS(_dxj_DirectPlayVoiceServer,realvoice,ret);
if (*ret==NULL) {
i=realvoice->Release();
return E_FAIL;
}
return hr;
}
STDMETHODIMP C_dxj_DirectX7Object::DirectPlayVoiceTestCreate(I_dxj_DirectPlayVoiceSetup **ret){
HRESULT hr;
LPDIRECTPLAYVOICETEST realsetup=NULL;
DWORD i=0;
#ifndef DX_FINAL_RELEASE
hr = TimeBomb();
if (FAILED(hr))
{
return E_FAIL;
}
#endif
if( FAILED(hr = CoCreateInstance(CLSID_DirectPlayVoiceTest,NULL,
CLSCTX_INPROC_SERVER,
IID_IDirectPlayVoiceTest,
(LPVOID*) &realsetup)))
return hr;
INTERNAL_CREATE_ADDRESS(_dxj_DirectPlayVoiceSetup,realsetup,ret);
if (*ret==NULL) {
i=realsetup->Release();
return E_FAIL;
}
return hr;
}
STDMETHODIMP C_dxj_DirectX7Object::DirectPlayPeerCreate(I_dxj_DirectPlayPeer **ret)
{
HRESULT hr;
IDirectPlay8Peer *lpDplayPeer = NULL;
#ifndef DX_FINAL_RELEASE
hr = TimeBomb();
if (FAILED(hr))
{
return E_FAIL;
}
#endif
if ( FAILED (hr = CoCreateInstance( CLSID_DirectPlay8Peer, NULL,CLSCTX_INPROC_SERVER,
IID_IDirectPlay8Peer, (LPVOID*) &lpDplayPeer ) ) )
return hr;
INTERNAL_CREATE_ADDRESS(_dxj_DirectPlayPeer, lpDplayPeer, ret);
if (*ret == NULL)
{
lpDplayPeer->Release();
return E_FAIL;
}
return hr;
}
STDMETHODIMP C_dxj_DirectX7Object::DirectPlayServerCreate(I_dxj_DirectPlayServer **ret)
{
HRESULT hr;
IDirectPlay8Server *lpDplayServer = NULL;
#ifndef DX_FINAL_RELEASE
hr = TimeBomb();
if (FAILED(hr))
{
return E_FAIL;
}
#endif
if ( FAILED (hr = CoCreateInstance( CLSID_DirectPlay8Server, NULL,CLSCTX_INPROC_SERVER,
IID_IDirectPlay8Server, (LPVOID*) &lpDplayServer ) ) )
return hr;
INTERNAL_CREATE_ADDRESS(_dxj_DirectPlayServer, lpDplayServer, ret);
if (*ret == NULL)
{
lpDplayServer->Release();
return E_FAIL;
}
return hr;
}
STDMETHODIMP C_dxj_DirectX7Object::DirectPlayAddressCreate(I_dxj_DirectPlayAddress **ret)
{
HRESULT hr;
IDirectPlay8Address *lpDplayAddress = NULL;
#ifndef DX_FINAL_RELEASE
hr = TimeBomb();
if (FAILED(hr))
{
return E_FAIL;
}
#endif
if ( FAILED (hr = CoCreateInstance( CLSID_DirectPlay8Address, NULL,CLSCTX_INPROC_SERVER,
IID_IDirectPlay8Address, (LPVOID*) &lpDplayAddress ) ) )
return hr;
INTERNAL_CREATE_ADDRESS(_dxj_DirectPlayAddress, lpDplayAddress, ret);
if (*ret == NULL)
{
lpDplayAddress->Release();
return E_FAIL;
}
return hr;
}
STDMETHODIMP C_dxj_DirectX7Object::DirectPlayClientCreate(I_dxj_DirectPlayClient **ret)
{
HRESULT hr;
IDirectPlay8Client *lpDplayClient = NULL;
#ifndef DX_FINAL_RELEASE
hr = TimeBomb();
if (FAILED(hr))
{
return E_FAIL;
}
#endif
if ( FAILED (hr = CoCreateInstance( CLSID_DirectPlay8Client, NULL,CLSCTX_INPROC_SERVER,
IID_IDirectPlay8Client, (LPVOID*) &lpDplayClient ) ) )
return hr;
INTERNAL_CREATE_ADDRESS(_dxj_DirectPlayClient, lpDplayClient, ret);
if (*ret == NULL)
{
lpDplayClient->Release();
return E_FAIL;
}
return hr;
}
STDMETHODIMP C_dxj_DirectX7Object::directSoundCreate(BSTR strGuid, I_dxj_DirectSound **ret){
HRESULT hr;
LPDIRECTSOUND8 realsound8=NULL;
GUID guid;
LPGUID pguid=&guid;
#ifndef DX_FINAL_RELEASE
hr = TimeBomb();
if (FAILED(hr))
{
return E_FAIL;
}
#endif
LoadDSOUND();
hr=BSTRtoPPGUID(&pguid,strGuid);
if FAILED(hr) return hr;
if (!m_pDirectSoundCreate) return E_FAIL;
hr=(m_pDirectSoundCreate)((GUID*)pguid,&realsound8,NULL);
if FAILED(hr) return hr;
INTERNAL_CREATE(_dxj_DirectSound,realsound8,ret);
if (*ret==NULL) {
realsound8->Release();
return E_FAIL;
}
return hr;
}
STDMETHODIMP C_dxj_DirectX7Object::directSoundCaptureCreate(BSTR strGuid, I_dxj_DirectSoundCapture **ret){
HRESULT hr;
LPDIRECTSOUNDCAPTURE realsound1=NULL;
LPDIRECTSOUNDCAPTURE8 realsound8=NULL;
GUID guid;
LPGUID pguid=&guid;
hr=BSTRtoPPGUID(&pguid,strGuid);
if FAILED(hr) return hr;
#ifndef DX_FINAL_RELEASE
hr = TimeBomb();
if (FAILED(hr))
{
return E_FAIL;
}
#endif
LoadDSOUND();
if (!m_pDirectSoundCaptureCreate) return E_FAIL;
hr=(m_pDirectSoundCaptureCreate)(pguid,&realsound1,NULL);
if FAILED(hr) return hr;
// I'm getting No Such interface on this call. - BUG
hr=realsound1->QueryInterface(IID_IDirectSoundCapture8,(void**)&realsound8);
realsound1->Release();
if FAILED(hr) return hr;
INTERNAL_CREATE(_dxj_DirectSoundCapture,realsound8,ret);
if (*ret==NULL) {
realsound8->Release();
return E_FAIL;
}
if (*ret==NULL) {
realsound1->Release();
return E_FAIL;
}
return hr;
}
STDMETHODIMP C_dxj_DirectX7Object::getDSCaptureEnum( I_dxj_DSEnum **retVal)
{
HRESULT hr;
#ifndef DX_FINAL_RELEASE
hr = TimeBomb();
if (FAILED(hr))
{
return E_FAIL;
}
#endif
LoadDSOUND();
if (!m_pDirectSoundCaptureEnumerate) return E_FAIL;
hr=C_dxj_DSEnumObject::create(NULL,m_pDirectSoundCaptureEnumerate,retVal);
return hr;
}
/////////////////////////////////////////////////////////////////////////////
STDMETHODIMP C_dxj_DirectX7Object::getDSEnum( I_dxj_DSEnum **retVal)
{
HRESULT hr;
#ifndef DX_FINAL_RELEASE
hr = TimeBomb();
if (FAILED(hr))
{
return E_FAIL;
}
#endif
LoadDSOUND();
if (!m_pDirectSoundEnumerate) return E_FAIL;
hr=C_dxj_DSEnumObject::create(m_pDirectSoundEnumerate,NULL,retVal);
return hr;
}
////////////////////////////////////////////////////////////////
STDMETHODIMP C_dxj_DirectX7Object::directInputCreate(I_dxj_DirectInput8 **ret){
HRESULT hr;
#ifndef DX_FINAL_RELEASE
hr = TimeBomb();
if (FAILED(hr))
{
return E_FAIL;
}
#endif
LoadDINPUTDLL();
//DirectInput8Create(HINSTANCE hinst, DWORD dwVersion, REFIID riidltf, LPVOID *ppvOut, LPUNKNOWN punkOuter);
static HRESULT (WINAPI *ProcAdd)(HINSTANCE , DWORD , REFIID , LPVOID *, LPUNKNOWN)=NULL;
if (ProcAdd==NULL){
if (g_hInstDINPUTDLL==NULL) return E_NOINTERFACE;
ProcAdd = (HRESULT (WINAPI *)(HINSTANCE , DWORD , REFIID , LPVOID *, LPUNKNOWN)) GetProcAddress(g_hInstDINPUTDLL, "DirectInput8Create");
if (ProcAdd==NULL) return E_FAIL;
}
LPDIRECTINPUT8W lpInput8=NULL;
hr= (ProcAdd)(g_hInst,(DWORD)DIRECTINPUT_VERSION,IID_IDirectInput8W,(void**)&lpInput8,NULL);
if FAILED(hr) return hr;
INTERNAL_CREATE(_dxj_DirectInput8,lpInput8,ret);
return hr;
}
// STDMETHODIMP C_dxj_DirectX7Object::systemBpp(long *retval)
// {
// HDC hdc;
//
// hdc = ::GetDC(NULL);
// *retval = GetDeviceCaps(hdc, BITSPIXEL);
// ::ReleaseDC(NULL, hdc);
//
// return S_OK;
// }
STDMETHODIMP C_dxj_DirectX7Object::directMusicLoaderCreate (
/* [retval][out] */ I_dxj_DirectMusicLoader __RPC_FAR *__RPC_FAR *ret)
{
HRESULT hr;
#ifndef DX_FINAL_RELEASE
hr = TimeBomb();
if (FAILED(hr))
{
return E_FAIL;
}
#endif
IDirectMusicLoader8 *pLoader=NULL;
hr =CoCreateInstance(
CLSID_DirectMusicLoader,
NULL,
CLSCTX_INPROC,
IID_IDirectMusicLoader8,
(void**)&pLoader);
if (FAILED(hr)) return E_NOINTERFACE;
if (!pLoader) return E_FAIL;
INTERNAL_CREATE_NOADDREF(_dxj_DirectMusicLoader,pLoader,ret);
return S_OK;
}
STDMETHODIMP C_dxj_DirectX7Object::directMusicComposerCreate (
/* [retval][out] */ I_dxj_DirectMusicComposer __RPC_FAR *__RPC_FAR *ret)
{
IDirectMusicComposer8 *pComp=NULL;
HRESULT hr;
#ifndef DX_FINAL_RELEASE
hr = TimeBomb();
if (FAILED(hr))
{
return E_FAIL;
}
#endif
if (FAILED(CoCreateInstance(
CLSID_DirectMusicComposer,
NULL,
CLSCTX_INPROC,
IID_IDirectMusicComposer8,
(void**)&pComp ))) {
return E_NOINTERFACE;
}
if (!pComp) return E_FAIL;
INTERNAL_CREATE_NOADDREF(_dxj_DirectMusicComposer,pComp,ret);
return S_OK;
}
STDMETHODIMP C_dxj_DirectX7Object::directMusicPerformanceCreate (
/* [retval][out] */ I_dxj_DirectMusicPerformance __RPC_FAR *__RPC_FAR *ret)
{
IDirectMusicPerformance8 *pPerf=NULL;
HRESULT hr;
#ifndef DX_FINAL_RELEASE
hr = TimeBomb();
if (FAILED(hr))
{
return E_FAIL;
}
#endif
if (FAILED(CoCreateInstance(
CLSID_DirectMusicPerformance,
NULL,
CLSCTX_INPROC,
IID_IDirectMusicPerformance8,
(void**)&pPerf ))) {
return E_NOINTERFACE;
}
if (!pPerf) return E_FAIL;
INTERNAL_CREATE_NOADDREF(_dxj_DirectMusicPerformance,pPerf,ret);
return S_OK;
}
#ifdef _WIN64
STDMETHODIMP C_dxj_DirectX7Object::createEvent(
/* [in] */ I_dxj_DirectXEvent8 __RPC_FAR *event,
/* [retval][out] */ HANDLE __RPC_FAR *h)
#else
STDMETHODIMP C_dxj_DirectX7Object::createEvent(
/* [in] */ I_dxj_DirectXEvent8 __RPC_FAR *event,
/* [retval][out] */ LONG __RPC_FAR *h)
#endif
{
HRESULT hr;
LPSTREAM pStm=NULL;
IUnknown *pUnk=NULL;
HANDLE hEvent=NULL;
EVENTTHREADINFO *pNewEvent=NULL;
EVENTTHREADINFO *pTemp=NULL;
if (!event) return E_INVALIDARG;
if (!h) return E_INVALIDARG;
pNewEvent=(EVENTTHREADINFO*)malloc(sizeof(EVENTTHREADINFO));
if (!pNewEvent) return E_OUTOFMEMORY;
ZeroMemory(pNewEvent, sizeof(EVENTTHREADINFO));
pNewEvent->pNext=NULL;
pNewEvent->fEnd=FALSE;
pNewEvent->pCallback=event;
pNewEvent->pStream=NULL;
event->AddRef();
pNewEvent->hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
if (!pNewEvent->hEvent){
free(pNewEvent);
event->Release();
return E_FAIL;
}
//pNewEvent->hEndEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
hr=event->QueryInterface(IID_IUnknown,(void**)&pUnk);
if FAILED(hr) {
free(pNewEvent);
event->Release();
return E_FAIL;
}
hr=CoMarshalInterThreadInterfaceInStream(IID_IUnknown,pUnk,&pStm);
if (pUnk) pUnk->Release();
if FAILED(hr) {
free(pNewEvent);
event->Release();
return E_FAIL;
}
pNewEvent->pStream=pStm;
pNewEvent->hThread=CreateThread(NULL,0,ThreadFunc,(unsigned long*)pNewEvent,CREATE_SUSPENDED ,&pNewEvent->threadID);
if (!pNewEvent->threadID) {
CloseHandle(pNewEvent->hEvent);
free(pNewEvent);
event->Release();
return E_FAIL;
}
if (!m_pEventList){
m_pEventList=pNewEvent;
}
else{
pTemp=m_pEventList;
m_pEventList=pNewEvent;
pNewEvent->pNext=pTemp;
}
ResumeThread(pNewEvent->hThread);
#ifdef _WIN64
*h=(pNewEvent->hEvent);
#else
*h=(LONG)PtrToLong(pNewEvent->hEvent);
#endif
return S_OK;
}
#ifdef _WIN64
STDMETHODIMP C_dxj_DirectX7Object::setEvent(
/* [in] */ HANDLE eventId)
{
SetEvent(eventId);
return S_OK;
}
#else
STDMETHODIMP C_dxj_DirectX7Object::setEvent(
/* [in] */ LONG eventId)
{
SetEvent((HANDLE)eventId);
return S_OK;
}
#endif
#ifdef _WIN64
STDMETHODIMP C_dxj_DirectX7Object::destroyEvent(
/* [in] */ HANDLE eventId)
#else
STDMETHODIMP C_dxj_DirectX7Object::destroyEvent(
/* [in] */ LONG eventId)
#endif
{
//find the info on the stack
if (!m_pEventList) return E_INVALIDARG;
EVENTTHREADINFO *pTemp=NULL;
EVENTTHREADINFO *pLast=NULL;
//rely on lazy evaluation
for (pTemp=m_pEventList; ((pTemp)&&(pTemp->hEvent!=(HANDLE)eventId));pLast=pTemp,pTemp=pTemp->pNext);
if (!pTemp) return E_INVALIDARG;
//remove it from our Link List
if (!pLast) {
m_pEventList=pTemp->pNext;
}
else {
pLast->pNext=pTemp->pNext;
}
//indicate that we want to kill the thread
pTemp->fEnd=TRUE;
//Fire the event in case we are waiting
if (pTemp->hEvent) SetEvent(pTemp->hEvent);
//Wait for it to finish out
if (pTemp->hThread) WaitForSingleObject(pTemp->hThread,1000);
//wait for the end event to signal
//if (pTemp->hEndEvent) WaitForSingleObject(pTemp->hEndEvent,1000);
//desctroy the event
if (pTemp->hEvent) CloseHandle(pTemp->hEvent);
//if (pTemp->hEndEvent) CloseHandle (pTemp->hEndEvent);
if (pTemp->pCallback) pTemp->pCallback->Release();
//thread is gone..
//free the memory
free(pTemp);
return S_OK;
}
DWORD WINAPI ThreadFunc(LPVOID param){
HRESULT hr;
IUnknown *pUnk=NULL;
EVENTTHREADINFO *pCntrl=(EVENTTHREADINFO *)param;
I_dxj_DirectXEvent8 *pVBCallback=NULL;
OleInitialize(NULL);
LCID LOCAL_SYSTEM_DEFAULT=GetSystemDefaultLCID();
//note pstrm is released even on failure
hr=CoGetInterfaceAndReleaseStream(pCntrl->pStream,IID_IUnknown,(void**)&pUnk);
pCntrl->pCallback=NULL; //since released to 0
if FAILED(hr) return -1;
if (!pUnk) return -1;
hr=pUnk->QueryInterface(IID_I_dxj_DirectXEvent8,(void**)&pVBCallback);
pUnk->Release();
if FAILED(hr) return -1;
while (pCntrl->fEnd==FALSE)
{
WaitForSingleObject(pCntrl->hEvent,INFINITE);
if ((pVBCallback )&&(pCntrl->fEnd==FALSE))
{
pVBCallback->AddRef();
#ifdef _WIN64
pVBCallback->DXCallback(pCntrl->hEvent);
#else
pVBCallback->DXCallback((LONG)PtrToLong(pCntrl->hEvent));
#endif
pVBCallback->Release();
}
}
if (pVBCallback) pVBCallback->Release();
OleUninitialize();
//we need to syncronize the ending of the thread..
//if (pCntrl->hEndEvent) SetEvent(pCntrl->hEndEvent);
return 0;
}
STDMETHODIMP C_dxj_DirectX7Object::createNewGuid(BSTR *ret)
{
GUID g=GUID_NULL;
if (!ret) return E_INVALIDARG;
::CoCreateGuid(&g);
*ret=GUIDtoBSTR(&g);
return S_OK;
}
STDMETHODIMP C_dxj_DirectX7Object::DirectXFileCreate(I_dxj_DirectXFile **ret)
{
HRESULT hr;
#ifndef DX_FINAL_RELEASE
hr = TimeBomb();
if (FAILED(hr))
{
return E_FAIL;
}
#endif
hr=C_dxj_DirectXFileObject::create(ret);
return hr;
}
STDMETHODIMP C_dxj_DirectX7Object::Direct3DCreate(IUnknown **ppRet)
{
HRESULT hr;
#ifndef DX_FINAL_RELEASE
hr = TimeBomb();
if (FAILED(hr))
{
return E_FAIL;
}
#endif
LoadD3D8();
if (!m_pDirect3DCreate8) return E_FAIL;
*ppRet=(IUnknown*) m_pDirect3DCreate8(D3D_SDK_VERSION);
return S_OK;
}