// TypeLibraryBrowser.cpp : Defines the class behaviors for the application.
//

#include "stdafx.h"
#include "TypeLibraryBrowser.h"
#include "TypeLibraryBrowserDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CTypeLibraryBrowserApp

BEGIN_MESSAGE_MAP(CTypeLibraryBrowserApp, CWinApp)
	//{{AFX_MSG_MAP(CTypeLibraryBrowserApp)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG
	ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTypeLibraryBrowserApp construction

CTypeLibraryBrowserApp::CTypeLibraryBrowserApp()
{
	// TODO: add construction code here,
	// Place all significant initialization in InitInstance
}

/////////////////////////////////////////////////////////////////////////////
// The one and only CTypeLibraryBrowserApp object

CTypeLibraryBrowserApp theApp;

/////////////////////////////////////////////////////////////////////////////
// CTypeLibraryBrowserApp initialization

BOOL CTypeLibraryBrowserApp::InitInstance()
{
	AfxEnableControlContainer();

	// Standard initialization
	// If you are not using these features and wish to reduce the size
	//  of your final executable, you should remove from the following
	//  the specific initialization routines you do not need.

#ifdef _AFXDLL
	Enable3dControls();			// Call this when using MFC in a shared DLL
#else
	Enable3dControlsStatic();	// Call this when linking to MFC statically
#endif

	CTypeLibraryBrowserDlg dlg;
	m_pMainWnd = &dlg;
	int nResponse = dlg.DoModal();
	if (nResponse == IDOK)
	{
		// TODO: Place code here to handle when the dialog is
		//  dismissed with OK
	}
	else if (nResponse == IDCANCEL)
	{
		// TODO: Place code here to handle when the dialog is
		//  dismissed with Cancel
	}

	// Since the dialog has been closed, return FALSE so that we exit the
	//  application, rather than start the application's message pump.
	return FALSE;
}

TCHAR *VarNames[] = {
	"nothing",                    
    "SQL style Null",               
    "2 byte signed int",             
    "4 byte signed int", 
    "4 byte real",                  
    "8 byte real",                  
    "currency",                    
    "date",                        
    "binary string",               
    "IDispatch",             
    "SCODE",                        
    "BOOL",             
    "VARIANT",                
    "IUnknown",
    "reserved (14)",
    "reserved (15)",                 
	"signed char",                  
    "unsigned char",                
    "2 byte unsigned int",  
    "4 byte unsigned int",               
    "signed 64-bit int",             
    "unsigned 64-bit int",          
    "signed machine int",          
    "unsigned machine int",         
    "C style void",                
    "HRESULT",                               
    "pointer type",                  
    "safe array (use VT_ARRAY in VARIANT)",     
    "C style array",                 
    "user defined type",  	       
    "null terminated string", 
    "null terminated wide string"  } ;
    
void MyOwnGetVarTypeName (TYPEDESC td, LPSTR cp)
{
	if (td.vt & VT_BYREF)
	{
		lstrcpy (cp, "pointer to ") ;
		MyOwnGetVarTypeName (*(td.lptdesc), cp + lstrlen(cp)) ;
	}
	else if (td.vt & VT_ARRAY)
	{
		int length = wsprintf (cp, "array [%d] of ", td.lpadesc->cDims) ;
		MyOwnGetVarTypeName (td.lpadesc->tdescElem, cp + length) ; 
	}
	else
	{
		lstrcpy (cp, VarNames [td.vt]) ;
	}
}

