Random program problem with hInstance

Robotoer

Member
Nov 9, 2004
39
0
0
I was trying to program a program that would display teapots that move around on the screen so that i could test my collision detector and physics engine. After completing the code initially and after debugging it, it worked as I had expected. But then, Windows XP gave me a message saying that some file (probably OS related) was corrupted and suggested running scandisk. So i did with the auto fix on. Next thing, when i had rebooted the computer, the program wouldn't run. And when i tried to run it with the debugger, it gave me an access violation when using the CreateWindow() function. I think that it's a problem with the hInstance variable that's being passed into the CreateWindow function because the other values are just flags and strings. I would greatly appreciate help on this.

note: stdafx.h and collisiontester2.1.h contain the essential include files needed to run this program

Thanks


// CollisionTest2.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "CollisionTester2.1.h"
#include <d3d9.h>
#include <d3dx9.h>
//#include <d3dx9tex.h>
#include <dinput.h>
#include <ctime>
#define MAX_LOADSTRING 100
#define KEYDOWN(name, key) (name[key] & 0x80)
#define BOX_SIZEX 10
#define BOX_SIZEY 10
#define BOX_SIZEZ 10

// Global Variables:
HINSTANCE hInst; // current instance
TCHAR szTitle[MAX_LOADSTRING]; // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING]; // the main window class name
LPDIRECT3D9 pD3D; // Direct3D object
LPDIRECT3DDEVICE9 pd3dDevice; // Direct3D display device
LPDIRECTINPUT8 DI_Object; // DirectInput object
LPDIRECTINPUTDEVICE8 DI_Device; // DirectInput device
LPD3DXMESH * objlist; // Pointer to list of objects
int objlistlen = 1; // Number of objects
D3DXVECTOR3 * translist; // List of translations for objects
D3DXVECTOR3 * movelist; // List of all the object move values
HRESULT hr; // Error container variable
bool allowrender; // Allows rendering to occur
D3DMATERIAL9 univmat; // Material for all the objects
bool rendering; // True if currently rendering
bool CKEYDWN; // True if the C key is pressed
bool CKEYDWN2; // True if the C key has been released
bool allow_move; // True if movement is allowed
bool allow_move2;
bool wireframeon; // True if wireframe rendering is on
bool wireframe2;
LPDIRECT3DVERTEXBUFFER9 buffer = NULL;

// Forward declarations of functions included in this code module:
ATOM MyRegisterClass(HINSTANCE hInstance);
HWND InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);
void render(HWND, LPD3DXMESH **);
void releaseD3D(LPD3DXMESH ** pobjlist);
void initD3D(HWND);
void CreateObj(LPD3DXMESH ** pobjlist, HWND hWnd);
void MoveObj();

int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
HWND hWnd;
char buffer[256];
MSG msg;
ZeroMemory(&msg,sizeof(MSG));
HACCEL hAccelTable;

// Initialize global strings
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_COLLISIONTESTER21, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
allowrender = false;
srand(static_cast<unsigned>(time(0)));

// Perform application initialization:
hWnd = InitInstance (hInstance, nCmdShow);



initD3D(hWnd );

D3DXVECTOR3 tempv(-10 + float(20.0 * rand()/(RAND_MAX+1.0)),
-10 + float(20.0 * rand()/(RAND_MAX+1.0)),
-10 + float(20.0 * rand()/(RAND_MAX+1.0)));
D3DXVECTOR3 tempm(-4 + float(8.0 * rand()/(RAND_MAX+1.0)),
-4 + float(8.0 * rand()/(RAND_MAX+1.0)),
-4 + float(8.0 * rand()/(RAND_MAX+1.0)));
translist = new D3DXVECTOR3[1];
movelist = new D3DXVECTOR3[1];
objlist = new LPD3DXMESH[1];

*translist = tempv;
*movelist = tempm;

hr = D3DXCreateTeapot(pd3dDevice, objlist, 0);
if(!FAILED(hr))
{
//MessageBox(hWnd, "Successfully created box using D3DXCreateBox", "UM...", NULL);
}
else
{
switch(hr)
{
case D3DERR_INVALIDCALL:
MessageBox(hWnd, "The method call is invalid. For example, a method's parameter may have an invalid value",
"ERROR", NULL);
break;
case D3DXERR_INVALIDDATA:
MessageBox(hWnd, "The data is invalid", "ERROR", NULL);
break;
case E_OUTOFMEMORY:
MessageBox(hWnd, "Microsoft Direct3D could not allocate sufficient memory to complete the call",
"ERROR", NULL);
break;
}
PostQuitMessage(0);
}
CKEYDWN = false;
CKEYDWN2 = true;
allow_move = true;
wireframeon = true;
wireframe2 = true;
D3DXCOLOR blue(0,0,1,1);
D3DXCOLOR darkblue(0,0,.25,1);
D3DXCOLOR red(1,0,0,1);
D3DXCOLOR green(0,1,0,1);
D3DXCOLOR nothing(0,0,0,1);
univmat.Ambient = blue;
univmat.Diffuse = green;
univmat.Emissive = nothing;
univmat.Specular = green;
univmat.Power = 1;
hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_COLLISIONTESTER21);

// Main message loop:
while( msg.message!=WM_QUIT )
{
if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
//dinput stuff
DI_Device->GetDeviceState(sizeof(buffer),(LPVOID) &buffer);
if(KEYDOWN(buffer, DIK_C))
{
if(CKEYDWN2 == true)
{
CKEYDWN = true;
CKEYDWN2 = false;
}
}
else
{
CKEYDWN2 = true;
}
if(KEYDOWN(buffer, DIK_R))
{
if(wireframe2)
{
if(!wireframeon)
{
pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
wireframeon = true;
}
else
{
pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
wireframeon = false;
}
}
wireframe2 = false;
}
else
{
wireframe2 = true;
}
if(KEYDOWN(buffer, DIK_M))
{
if(allow_move2)
{
if(allow_move)
allow_move = false;
else
allow_move = true;
allow_move2 = false;
}
}
else
{
allow_move2 = true;
}



if(CKEYDWN == true)
{
if(!rendering)
{
CreateObj(&objlist, hWnd);
}
CKEYDWN = false;
}
render(hWnd, &objlist);
if(allow_move)
{
MoveObj();
}
}
}
return (int) msg.wParam;
}



//
// FUNCTION: MyRegisterClass()
//
// PURPOSE: Registers the window class.
//
// COMMENTS:
//
// This function and its usage are only necessary if you want this code
// to be compatible with Win32 systems prior to the 'RegisterClassEx'
// function that was added to Windows 95. It is important to call this function
// so that the application will get 'well formed' small icons associated
// with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_COLLISIONTESTER21);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = (LPCTSTR)IDC_COLLISIONTESTER21;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);

return RegisterClassEx(&wcex);
}

//
// FUNCTION: InitInstance(HANDLE, int)
//
// PURPOSE: Saves instance handle and creates main window
//
// COMMENTS:
//
// In this function, we save the instance handle in a global variable and
// create and display the main program window.
//
HWND InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance; // Store instance handle in our global variable

hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

if (!hWnd)
{
return FALSE;
}

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

return hWnd;
}

//
// FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
//
// PURPOSE: Processes messages for the main window.
//
// WM_COMMAND - process the application menu
// WM_PAINT - Paint the main window
// WM_DESTROY - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;

switch (message)
{
case WM_CREATE:
allowrender = true;
break;
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_DESTROY:
releaseD3D(&objlist);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

// Message handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
return TRUE;

case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}

/*-----------------------------------------------
Global Function: initD3D
Parameters: HWND hWnd
Purpose: Initializes Direct3d
-----------------------------------------------*/
void initD3D(HWND hWnd)
{
HRESULT hr;
pD3D = NULL;
pd3dDevice = NULL;

pD3D = Direct3DCreate9(D3D_SDK_VERSION);
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.BackBufferHeight = 1024;
d3dpp.BackBufferWidth = 1280;
d3dpp.hDeviceWindow = hWnd;

pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_REF,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&pd3dDevice);
hr = pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
if FAILED(hr)
{
MessageBox(hWnd,"Error Setting RenderState fillmode","ERROR",NULL);
}

D3DLIGHT9 light0;
light0.Type = D3DLIGHT_POINT;
light0.Position = D3DXVECTOR3(0,0,0);
light0.Diffuse.r = 1;
light0.Diffuse.g = 1;
light0.Diffuse.b = 1.5;
light0.Ambient.r = 0;
light0.Ambient.g = 0;
light0.Ambient.b = .5;
light0.Range = 100;

hr = pd3dDevice->SetRenderState(D3DRS_LIGHTING, TRUE);
if FAILED(hr)
{
MessageBox(hWnd, "Error enabling lights", "ERROR", NULL);
}

/*hr = pd3dDevice->SetRenderState(D3DRS_AMBIENT, D3DCOLOR_XRGB (50,50,255));
if FAILED(hr)
{
MessageBox(hWnd,"Error Setting Renderstate Ambiencelighting","ERROR",NULL);
}*/

pd3dDevice->SetLight(0, &light0);
pd3dDevice->LightEnable(0,TRUE);

hr = pd3dDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
if FAILED(hr)
{
MessageBox(hWnd,"Error Setting ShadeMode", "ERROR",NULL);
}

//Dinput
hr = DirectInput8Create( hInst, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&DI_Object, NULL );
if FAILED(hr)
{
MessageBox(hWnd,"Error Creating obj...", "Error",NULL);
PostQuitMessage(0);
}
//DI_Object->EnumDevices(DI8DEVCLASS_KEYBOARD,
hr = DI_Object->CreateDevice(GUID_SysKeyboard, &DI_Device, NULL);
if(!(hr == DI_OK))
{
MessageBox(hWnd,"Error Creating dev...", "Error",NULL);
PostQuitMessage(0);
}
hr = DI_Device->SetDataFormat(&c_dfDIKeyboard);
if FAILED(hr)
{
MessageBox(hWnd,"Error setting format...", "Error",NULL);
PostQuitMessage(0);
}
hr = DI_Device->SetCooperativeLevel(hWnd, DISCL_BACKGROUND | DISCL_NONEXCLUSIVE);
if FAILED(hr)
{
switch(hr)
{
case DIERR_INVALIDPARAM:
MessageBox(hWnd,"Input device did not allow for selected coorperative level to be set","Error",NULL);
break;
case DIERR_NOTINITIALIZED:
MessageBox(hWnd,"DInput Obj not init","Error",NULL);
break;
case E_HANDLE:
MessageBox(hWnd,"The HWND parameter is not a valid top-level window that belongs to the process","Error",NULL);
break;
default:
MessageBox(hWnd,"Uknown Error","Error",NULL);
break;
}
//MessageBox(hWnd,"Error setting coorperative level...", "Error",NULL);
PostQuitMessage(0);
}
hr = DI_Device->Acquire();
if FAILED(hr)
{
switch(hr)
{
case DIERR_INVALIDPARAM:
MessageBox(hWnd,"Invalid Parameter","Error",NULL);
break;
case DIERR_NOTINITIALIZED:
MessageBox(hWnd,"Obj not init","Error",NULL);
break;
case DIERR_OTHERAPPHASPRIO:
MessageBox(hWnd,"Other app has higher priority","Error",NULL);
break;
default:
MessageBox(hWnd,"Uknown Error","Error",NULL);
break;
}
//MessageBox(hWnd,"Error Acquiring...", "Error",NULL);
PostQuitMessage(0);
}
}

/*-----------------------------------------------
Global Function: releaseD3D
Parameters: none
Purpose: Releases Direct3D related
pointers
-----------------------------------------------*/
void releaseD3D(LPD3DXMESH ** pobjlist)
{
pD3D->Release();
pd3dDevice->Release();
DI_Object->Release();
DI_Device->Unacquire();
DI_Device->Release();
DI_Device = NULL;
for(int a = 0; a < objlistlen; a = a + 1)
{
(*(*(pobjlist) + a))->Release();
}
delete []objlist;
}

/*-----------------------------------------------
Global Function: render
Parameters: HWND hWnd
Purpose: Renders the current scene to
the display device specified
in initD3D()
-----------------------------------------------*/
void render(HWND hWnd, LPD3DXMESH ** pobjlist)
{
if(allowrender)
{
MessageBox(hWnd,"Rendering...","...",NULL);
rendering = true;
D3DXMATRIX tempmatrix;
D3DXVECTOR3 * ptempv;
D3DXVECTOR3 campos(20,20,20);
D3DXVECTOR3 camtarget(0,0,0);
D3DXVECTOR3 up(0,1,0);
D3DXMATRIX v;
D3DXMatrixPerspectiveFovLH(&v, D3DX_PI/4, 800/600, 0, 100);
pd3dDevice->SetTransform(D3DTS_PROJECTION, &v);
D3DXMatrixLookAtLH(&v, &campos, &camtarget, &up);
pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
pd3dDevice->BeginScene();
pd3dDevice->SetMaterial(&univmat);
pd3dDevice->SetTransform(D3DTS_VIEW, &v);
for(int a = 0; a < objlistlen; a = a + 1)
{
ptempv = translist + a;
D3DXMatrixTranslation(&tempmatrix, ptempv->x, ptempv->y, ptempv->z);
pd3dDevice->SetTransform(D3DTS_WORLD, &tempmatrix);
hr = (*(*(pobjlist) + a))->DrawSubset(0);
if(FAILED(hr))
{
MessageBox(hWnd, "WTFOMFGBBQ the model won't display!", "BIG FING ERROR", NULL);
}
}
pd3dDevice->EndScene();
pd3dDevice->Present(NULL, NULL, NULL, NULL);
rendering = false;
}
}

/*-----------------------------------------------
Global Function: CreateObj
Parameters: none
Purpose: Adds another randomly placed
object that begins moving
randomly
-----------------------------------------------*/
void CreateObj(LPD3DXMESH ** pobjlist, HWND hWnd)
{
D3DXVECTOR3 tempv;
D3DXVECTOR3 tempm;

LPD3DXMESH * ptemp;
D3DXVECTOR3 * ptempv;
D3DXVECTOR3 * ptempm;

LPD3DXMESH * ptemp2;
D3DXVECTOR3 * ptempv2;
D3DXVECTOR3 * ptempm2;

LPD3DXMESH * templist = new LPD3DXMESH[objlistlen];
D3DXVECTOR3 * templistv = new D3DXVECTOR3[objlistlen];
D3DXVECTOR3 * templistm = new D3DXVECTOR3[objlistlen];

for(int b = 0; b < objlistlen; b = b + 1)
{
ptemp = objlist + b;
ptemp2 = templist + b;
*ptemp2 = *ptemp;
}
for(int c = 0; c < objlistlen; c = c + 1)
{
ptempv = translist + c;
ptempv2 = templistv + c;
*ptempv2 = *ptempv;
}
for(int d = 0; d < objlistlen; d = d + 1)
{
ptempm = movelist + d;
ptempm2 = templistm + d;
*ptempm2 = *ptempm;
}
for(int i = 0; i > objlistlen; i = i + 1)
{
(*(*(pobjlist) + i))->Release();
}
delete []objlist;
delete []translist;
delete []movelist;

objlist = new LPD3DXMESH[objlistlen + 1];
translist = new D3DXVECTOR3[objlistlen + 1];
movelist = new D3DXVECTOR3[objlistlen + 1];

for(int e = 0; e < objlistlen; e = e + 1)
{
ptemp = objlist + e;
ptemp2 = templist + e;
*ptemp = *ptemp2;
}
for(int f = 0; f < objlistlen; f = f + 1)
{
ptempv = translist + f;
ptempv2 = templistv + f;
*ptempv = *ptempv2;
}
for(int g = 0; g < objlistlen; g = g + 1)
{
ptempm = movelist + g;
ptempm2 = templistm + g;
*ptempm = *ptempm2;
}

objlistlen = objlistlen + 1;

/*hr = D3DXCreateBox(pd3dDevice, (int(8.0 * rand()/(RAND_MAX+1.0)) - 4),
(int(8.0 * rand()/(RAND_MAX+1.0)) - 4),
(int(8.0 * rand()/(RAND_MAX+1.0)) - 4),
((*pobjlist) + (objlistlen - 1)), 0);*/
hr = D3DXCreateTeapot(pd3dDevice, (objlist + (objlistlen - 1)), 0);
if(!FAILED(hr))
{
//MessageBox(hWnd, "Successfully created box using D3DXCreateBox", "UM...", NULL);
}
else
{
switch(hr)
{
case D3DERR_INVALIDCALL:
MessageBox(hWnd, "The method call is invalid. For example, a method's parameter may have an invalid value",
"ERROR", NULL);
break;
case D3DXERR_INVALIDDATA:
MessageBox(hWnd, "The data is invalid", "ERROR", NULL);
break;
case E_OUTOFMEMORY:
MessageBox(hWnd, "Microsoft Direct3D could not allocate sufficient memory to complete the call",
"ERROR", NULL);
break;
}
PostQuitMessage(0);
allowrender = false;
}

tempv.x = -BOX_SIZEX + float(2 * BOX_SIZEX * rand()/(RAND_MAX+1.0));
tempv.y = -BOX_SIZEY + float(2 * BOX_SIZEY * rand()/(RAND_MAX+1.0));
tempv.z = -BOX_SIZEZ + float(2 * BOX_SIZEZ * rand()/(RAND_MAX+1.0));

tempm.x = -4 + float(8.0 * rand()/(RAND_MAX+1.0));
tempm.y = -4 + float(8.0 * rand()/(RAND_MAX+1.0));
tempm.z = -4 + float(8.0 * rand()/(RAND_MAX+1.0));

ptempv = translist + objlistlen - 1;
ptempm = movelist + objlistlen - 1;

*ptempv = tempv;
*ptempm = tempm;
}

/*-----------------------------------------------
Global Function: MoveObj
Parameters: none
Purpose: Uses the move values to
move the objects to their
new locations
-----------------------------------------------*/
void MoveObj()
{
D3DXVECTOR3 temp;
D3DXVECTOR3 * ptempv;
D3DXVECTOR3 * ptempm;
for(int h = 0; h < objlistlen; h = h + 1)
{
ptempv = translist + h;
ptempm = movelist + h;
if((ptempv->x > BOX_SIZEX) || (ptempv->x < -BOX_SIZEX))
{
ptempm->x = -(ptempm->x);
}
if((ptempv->y > BOX_SIZEY) || (ptempv->y < -BOX_SIZEY))
{
ptempm->y = -(ptempm->y);
}
if((ptempv->z > BOX_SIZEZ) || (ptempv->z < -BOX_SIZEZ))
{
ptempm->z = -(ptempm->z);
}
*ptempv = *ptempv + *ptempm;
}
}
 
sale-70-410-exam    | Exam-200-125-pdf    | we-sale-70-410-exam    | hot-sale-70-410-exam    | Latest-exam-700-603-Dumps    | Dumps-98-363-exams-date    | Certs-200-125-date    | Dumps-300-075-exams-date    | hot-sale-book-C8010-726-book    | Hot-Sale-200-310-Exam    | Exam-Description-200-310-dumps?    | hot-sale-book-200-125-book    | Latest-Updated-300-209-Exam    | Dumps-210-260-exams-date    | Download-200-125-Exam-PDF    | Exam-Description-300-101-dumps    | Certs-300-101-date    | Hot-Sale-300-075-Exam    | Latest-exam-200-125-Dumps    | Exam-Description-200-125-dumps    | Latest-Updated-300-075-Exam    | hot-sale-book-210-260-book    | Dumps-200-901-exams-date    | Certs-200-901-date    | Latest-exam-1Z0-062-Dumps    | Hot-Sale-1Z0-062-Exam    | Certs-CSSLP-date    | 100%-Pass-70-383-Exams    | Latest-JN0-360-real-exam-questions    | 100%-Pass-4A0-100-Real-Exam-Questions    | Dumps-300-135-exams-date    | Passed-200-105-Tech-Exams    | Latest-Updated-200-310-Exam    | Download-300-070-Exam-PDF    | Hot-Sale-JN0-360-Exam    | 100%-Pass-JN0-360-Exams    | 100%-Pass-JN0-360-Real-Exam-Questions    | Dumps-JN0-360-exams-date    | Exam-Description-1Z0-876-dumps    | Latest-exam-1Z0-876-Dumps    | Dumps-HPE0-Y53-exams-date    | 2017-Latest-HPE0-Y53-Exam    | 100%-Pass-HPE0-Y53-Real-Exam-Questions    | Pass-4A0-100-Exam    | Latest-4A0-100-Questions    | Dumps-98-365-exams-date    | 2017-Latest-98-365-Exam    | 100%-Pass-VCS-254-Exams    | 2017-Latest-VCS-273-Exam    | Dumps-200-355-exams-date    | 2017-Latest-300-320-Exam    | Pass-300-101-Exam    | 100%-Pass-300-115-Exams    |
http://www.portvapes.co.uk/    | http://www.portvapes.co.uk/    |