?
Solved

MCI questions

Posted on 2006-06-03
5
Medium Priority
?
579 Views
Last Modified: 2008-01-09
Hi, i have a problem here and i just happened to saw MCI which might have a solution to my problem but i would like to have some advice on it.

I have a machine with 2 sound cards and i am trying to make an app that will enables me to select which sound card to play the mp3 files and with all the necessary features like changing the volume of left side audio, paning etc.

Thanks
0
Comment
Question by:jaxrpc
  • 3
5 Comments
 

Author Comment

by:jaxrpc
ID: 16826161
anyone?
0
 
LVL 11

Expert Comment

by:dbkruger
ID: 16827360
I don't know how to select sound cards, but I recently came across the open source code at vorbis.com, and definitely recommend it as better than mp3, and free from obnoxious royalty issues.
0
 

Author Comment

by:jaxrpc
ID: 16827974
ehh sorry, but playing in mp3 format is a requirement.
0
 
LVL 8

Accepted Solution

by:
mrblue earned 1000 total points
ID: 16833074
The following sample uses DirectShow to play mp3 file. Audio renderer (what implies second sound card) can be selected from combobox.

Sample application used dialog with 3 buttons (start, pause, stop) & combobox filled with avaiable audio renderers.

=============================================
// TEST_EE_PlayMP3withMultSndCardsDlg.h : header file
//

#if !defined(AFX_TEST_EE_PLAYMP3WITHMULTSNDCARDSDLG_H__74ACB528_9F84_407D_B5BD_2DD24004ECAC__INCLUDED_)
#define AFX_TEST_EE_PLAYMP3WITHMULTSNDCARDSDLG_H__74ACB528_9F84_407D_B5BD_2DD24004ECAC__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include <dshow.h>
#include <comdef.h>

_COM_SMARTPTR_TYPEDEF(ICreateDevEnum, IID_ICreateDevEnum);
_COM_SMARTPTR_TYPEDEF(IBaseFilter, IID_IBaseFilter);
_COM_SMARTPTR_TYPEDEF(ICaptureGraphBuilder2, IID_ICaptureGraphBuilder2);
_COM_SMARTPTR_TYPEDEF(IFilterGraph2, IID_IFilterGraph2);
_COM_SMARTPTR_TYPEDEF(IMediaControl, IID_IMediaControl);
_COM_SMARTPTR_TYPEDEF(IEnumPins, IID_IEnumPins);
_COM_SMARTPTR_TYPEDEF(IPin, IID_IPin);

class CTEST_EE_PlayMP3withMultSndCardsDlgAutoProxy;

/////////////////////////////////////////////////////////////////////////////
// CTEST_EE_PlayMP3withMultSndCardsDlg dialog

class CTEST_EE_PlayMP3withMultSndCardsDlg : public CDialog
{
      DECLARE_DYNAMIC(CTEST_EE_PlayMP3withMultSndCardsDlg);
      friend class CTEST_EE_PlayMP3withMultSndCardsDlgAutoProxy;

// Construction
public:
      CTEST_EE_PlayMP3withMultSndCardsDlg(CWnd* pParent = NULL);      // standard constructor
      virtual ~CTEST_EE_PlayMP3withMultSndCardsDlg();

// Dialog Data
      //{{AFX_DATA(CTEST_EE_PlayMP3withMultSndCardsDlg)
      enum { IDD = IDD_TEST_EE_PLAYMP3WITHMULTSNDCARDS_DIALOG };
      CComboBox      m_ctrlCBAudioRenderer;
      //}}AFX_DATA

      // ClassWizard generated virtual function overrides
      //{{AFX_VIRTUAL(CTEST_EE_PlayMP3withMultSndCardsDlg)
      protected:
      virtual void DoDataExchange(CDataExchange* pDX);      // DDX/DDV support
      //}}AFX_VIRTUAL

// Implementation
protected:
      CTEST_EE_PlayMP3withMultSndCardsDlgAutoProxy* m_pAutoProxy;
      HICON m_hIcon;

      BOOL CanExit();

      // Generated message map functions
      //{{AFX_MSG(CTEST_EE_PlayMP3withMultSndCardsDlg)
      virtual BOOL OnInitDialog();
      afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
      afx_msg void OnPaint();
      afx_msg HCURSOR OnQueryDragIcon();
      afx_msg void OnClose();
      virtual void OnOK();
      virtual void OnCancel();
      afx_msg void OnDestroy();
      afx_msg void OnButton1();
      afx_msg void OnButton4();
      afx_msg void OnButton3();
      afx_msg void OnSelchangeCombo1();
      //}}AFX_MSG
      DECLARE_MESSAGE_MAP()
private:
      HRESULT _AddAudioRendererToGraph();
      HRESULT _ReplaceAudioRenderer();
      HRESULT _Stop();
      HRESULT _Pause();
      HRESULT _Run();
      HRESULT _BuildGraph();
      ICaptureGraphBuilder2Ptr m_pCapBuilder;
      IFilterGraph2Ptr m_pGraphBuilder;
      IBaseFilterPtr m_pSource;
      IBaseFilterPtr m_pAudioRenderer;
      DWORD m_dwRegister;

      void _RemoveFromROT(DWORD pdwRegister);
      HRESULT _AddToROT(IUnknown *pUnkGraph, DWORD *pdwRegister);
      VOID _Uninit();
      VOID _UninitDirectShow();
      HRESULT _InitDirectShow();
      VOID _ReleaseAudioRenderers();
      VOID _EnumerateAudioRenderers();
      VOID _Init();
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_TEST_EE_PLAYMP3WITHMULTSNDCARDSDLG_H__74ACB528_9F84_407D_B5BD_2DD24004ECAC__INCLUDED_)
===========================================
// TEST_EE_PlayMP3withMultSndCardsDlg.cpp : implementation file
//

#include "stdafx.h"
#include <afxpriv.h>
#include <dshow.h>
#include "TEST_EE_PlayMP3withMultSndCards.h"

#include "TEST_EE_PlayMP3withMultSndCardsDlg.h"
#include "DlgProxy.h"

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

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
      CAboutDlg();

// Dialog Data
      //{{AFX_DATA(CAboutDlg)
      enum { IDD = IDD_ABOUTBOX };
      //}}AFX_DATA

      // ClassWizard generated virtual function overrides
      //{{AFX_VIRTUAL(CAboutDlg)
      protected:
      virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
      //}}AFX_VIRTUAL

// Implementation
protected:
      //{{AFX_MSG(CAboutDlg)
      //}}AFX_MSG
      DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
      //{{AFX_DATA_INIT(CAboutDlg)
      //}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
      CDialog::DoDataExchange(pDX);
      //{{AFX_DATA_MAP(CAboutDlg)
      //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
      //{{AFX_MSG_MAP(CAboutDlg)
            // No message handlers
      //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTEST_EE_PlayMP3withMultSndCardsDlg dialog

IMPLEMENT_DYNAMIC(CTEST_EE_PlayMP3withMultSndCardsDlg, CDialog);

CTEST_EE_PlayMP3withMultSndCardsDlg::CTEST_EE_PlayMP3withMultSndCardsDlg(CWnd* pParent /*=NULL*/)
      : CDialog(CTEST_EE_PlayMP3withMultSndCardsDlg::IDD, pParent), m_dwRegister(0)
{
      //{{AFX_DATA_INIT(CTEST_EE_PlayMP3withMultSndCardsDlg)
            // NOTE: the ClassWizard will add member initialization here
      //}}AFX_DATA_INIT
      // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
      m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
      m_pAutoProxy = NULL;
}

CTEST_EE_PlayMP3withMultSndCardsDlg::~CTEST_EE_PlayMP3withMultSndCardsDlg()
{
      // If there is an automation proxy for this dialog, set
      //  its back pointer to this dialog to NULL, so it knows
      //  the dialog has been deleted.
      if (m_pAutoProxy != NULL)
            m_pAutoProxy->m_pDialog = NULL;
}

void CTEST_EE_PlayMP3withMultSndCardsDlg::DoDataExchange(CDataExchange* pDX)
{
      CDialog::DoDataExchange(pDX);
      //{{AFX_DATA_MAP(CTEST_EE_PlayMP3withMultSndCardsDlg)
      DDX_Control(pDX, IDC_COMBO1, m_ctrlCBAudioRenderer);
      //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CTEST_EE_PlayMP3withMultSndCardsDlg, CDialog)
      //{{AFX_MSG_MAP(CTEST_EE_PlayMP3withMultSndCardsDlg)
      ON_WM_SYSCOMMAND()
      ON_WM_PAINT()
      ON_WM_QUERYDRAGICON()
      ON_WM_CLOSE()
      ON_WM_DESTROY()
      ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
      ON_BN_CLICKED(IDC_BUTTON4, OnButton4)
      ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
      ON_CBN_SELCHANGE(IDC_COMBO1, OnSelchangeCombo1)
      //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTEST_EE_PlayMP3withMultSndCardsDlg message handlers

BOOL CTEST_EE_PlayMP3withMultSndCardsDlg::OnInitDialog()
{
      CDialog::OnInitDialog();

      // Add "About..." menu item to system menu.

      // IDM_ABOUTBOX must be in the system command range.
      ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
      ASSERT(IDM_ABOUTBOX < 0xF000);

      CMenu* pSysMenu = GetSystemMenu(FALSE);
      if (pSysMenu != NULL)
      {
            CString strAboutMenu;
            strAboutMenu.LoadString(IDS_ABOUTBOX);
            if (!strAboutMenu.IsEmpty())
            {
                  pSysMenu->AppendMenu(MF_SEPARATOR);
                  pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
            }
      }

      // Set the icon for this dialog.  The framework does this automatically
      //  when the application's main window is not a dialog
      SetIcon(m_hIcon, TRUE);                  // Set big icon
      SetIcon(m_hIcon, FALSE);            // Set small icon
      
      _Init();
      
      return TRUE;  // return TRUE  unless you set the focus to a control
}

void CTEST_EE_PlayMP3withMultSndCardsDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
      if ((nID & 0xFFF0) == IDM_ABOUTBOX)
      {
            CAboutDlg dlgAbout;
            dlgAbout.DoModal();
      }
      else
      {
            CDialog::OnSysCommand(nID, lParam);
      }
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CTEST_EE_PlayMP3withMultSndCardsDlg::OnPaint()
{
      if (IsIconic())
      {
            CPaintDC dc(this); // device context for painting

            SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

            // Center icon in client rectangle
            int cxIcon = GetSystemMetrics(SM_CXICON);
            int cyIcon = GetSystemMetrics(SM_CYICON);
            CRect rect;
            GetClientRect(&rect);
            int x = (rect.Width() - cxIcon + 1) / 2;
            int y = (rect.Height() - cyIcon + 1) / 2;

            // Draw the icon
            dc.DrawIcon(x, y, m_hIcon);
      }
      else
      {
            CDialog::OnPaint();
      }
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CTEST_EE_PlayMP3withMultSndCardsDlg::OnQueryDragIcon()
{
      return (HCURSOR) m_hIcon;
}

// Automation servers should not exit when a user closes the UI
//  if a controller still holds on to one of its objects.  These
//  message handlers make sure that if the proxy is still in use,
//  then the UI is hidden but the dialog remains around if it
//  is dismissed.

void CTEST_EE_PlayMP3withMultSndCardsDlg::OnClose()
{
      if (CanExit())
            CDialog::OnClose();
}

void CTEST_EE_PlayMP3withMultSndCardsDlg::OnOK()
{
      if (CanExit())
            CDialog::OnOK();
}

void CTEST_EE_PlayMP3withMultSndCardsDlg::OnCancel()
{
      if (CanExit())
            CDialog::OnCancel();
}

BOOL CTEST_EE_PlayMP3withMultSndCardsDlg::CanExit()
{
      // If the proxy object is still around, then the automation
      //  controller is still holding on to this application.  Leave
      //  the dialog around, but hide its UI.
      if (m_pAutoProxy != NULL)
      {
            ShowWindow(SW_HIDE);
            return FALSE;
      }

      return TRUE;
}

VOID CTEST_EE_PlayMP3withMultSndCardsDlg::_Init()
{
      _EnumerateAudioRenderers();
      
      if(SUCCEEDED(_InitDirectShow())) {
            _BuildGraph();
      };
}

VOID CTEST_EE_PlayMP3withMultSndCardsDlg::_EnumerateAudioRenderers()
{
      HRESULT hRes;
      ICreateDevEnumPtr pDevEnum;
    IEnumMonikerPtr pEnum;

      _ReleaseAudioRenderers();

      // Create the system device enumerator.
    hRes = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC, IID_ICreateDevEnum, (void**)&pDevEnum);

      if(SUCCEEDED(hRes)) {
            // Create a class enumerator for the specified category.
            hRes = pDevEnum->CreateClassEnumerator(CLSID_AudioRendererCategory, &pEnum, 0);

            if(SUCCEEDED(hRes)) {
                // Enumerate devices within this category.
                  IMonikerPtr pMoniker;

                  while(pEnum->Next(1, &pMoniker, 0) == S_OK) {
                        IPropertyBagPtr pBag;

                        hRes = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag);

                        if(FAILED(hRes)) {
                              pMoniker.Release();
                              continue; // Maybe the next one will work.
                        };

                        // Check the friendly name.
                        COleVariant var;

                        hRes = pBag->Read(L"FriendlyName", &var, NULL);

                        if(SUCCEEDED(hRes)) {
                              IBaseFilter *pFilter;

                              // This is the right filter.
                              hRes = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void **)&pFilter);

                              if(SUCCEEDED(hRes)) {
                                    CString strAudioRenderer;
                                    INT nPos;

                                    strAudioRenderer.Format(TEXT("%ls"), var.bstrVal);            

                                    nPos = m_ctrlCBAudioRenderer.AddString((LPCTSTR)strAudioRenderer);

                                    if(nPos >= 0) {
                                          m_ctrlCBAudioRenderer.SetItemData(nPos, reinterpret_cast<DWORD>(pFilter)); // store audio renderer here
                                    }
                                    else
                                          pFilter->Release();
                              };
                        };

                        pMoniker.Release();
                  }
            };
      };

      if(m_ctrlCBAudioRenderer.GetCount() > 0) {
            m_ctrlCBAudioRenderer.SetCurSel(0);
      };
}

VOID CTEST_EE_PlayMP3withMultSndCardsDlg::_ReleaseAudioRenderers()
{
      INT nElements, i;

      nElements = m_ctrlCBAudioRenderer.GetCount();

      for(i=0; i<nElements; i++) {
            IBaseFilter *pFilter = reinterpret_cast<IBaseFilter *>(m_ctrlCBAudioRenderer.GetItemData(i));

            if(pFilter != NULL) pFilter->Release();
      }

      m_ctrlCBAudioRenderer.ResetContent();
}

HRESULT CTEST_EE_PlayMP3withMultSndCardsDlg::_InitDirectShow()
{
      HRESULT hRes;

      _UninitDirectShow();
      hRes = m_pGraphBuilder.CreateInstance(CLSID_FilterGraph);

      if(SUCCEEDED(hRes)) {
            hRes = _AddToROT(m_pGraphBuilder, &m_dwRegister);

            hRes = m_pCapBuilder.CreateInstance(CLSID_CaptureGraphBuilder2);

            if(SUCCEEDED(hRes)) {
                  hRes = m_pCapBuilder->SetFiltergraph(m_pGraphBuilder);
            };
      };

      return hRes;
}

VOID CTEST_EE_PlayMP3withMultSndCardsDlg::_UninitDirectShow()
{
      _RemoveFromROT(m_dwRegister);

      if(m_pGraphBuilder != NULL) m_pGraphBuilder.Release();
      if(m_pCapBuilder != NULL) m_pCapBuilder.Release();
}

VOID CTEST_EE_PlayMP3withMultSndCardsDlg::_Uninit()
{
      if(m_pAudioRenderer != NULL) m_pAudioRenderer.Release();
      _UninitDirectShow();
      _ReleaseAudioRenderers();
}

void CTEST_EE_PlayMP3withMultSndCardsDlg::OnDestroy()
{
      _Uninit();

      CDialog::OnDestroy();
}

HRESULT CTEST_EE_PlayMP3withMultSndCardsDlg::_AddToROT(IUnknown *pUnkGraph, DWORD *pdwRegister)
{
    IMoniker *pMoniker;
    IRunningObjectTable *pROT;

    if(FAILED(GetRunningObjectTable(0, &pROT))) {
        return E_FAIL;
    };

    WCHAR wsz[256];
    wsprintfW(wsz, L"FilterGraph %08x pid %08x", (DWORD_PTR)pUnkGraph, GetCurrentProcessId());
    HRESULT hRes = CreateItemMoniker(L"!", wsz, &pMoniker);

    if(SUCCEEDED(hRes)) {
        hRes = pROT->Register(ROTFLAGS_REGISTRATIONKEEPSALIVE, pUnkGraph, pMoniker, pdwRegister);
        pMoniker->Release();
    };

    pROT->Release();
    return hRes;
}

void CTEST_EE_PlayMP3withMultSndCardsDlg::_RemoveFromROT(DWORD pdwRegister)
{
    IRunningObjectTable *pROT;

    if(SUCCEEDED(GetRunningObjectTable(0, &pROT))) {
        pROT->Revoke(pdwRegister);
        pROT->Release();
    };
}

HRESULT CTEST_EE_PlayMP3withMultSndCardsDlg::_BuildGraph()
{
      HRESULT hRes = S_OK;

      hRes = m_pGraphBuilder->AddSourceFilter(OLESTR("c:\\36789.mp3"), OLESTR("SM MP3"), &m_pSource);
      if(FAILED(hRes)) return hRes;

      hRes = _AddAudioRendererToGraph();
      if(FAILED(hRes)) return hRes;

      hRes = m_pCapBuilder->RenderStream(NULL, NULL, m_pSource, NULL, m_pAudioRenderer);
      if(FAILED(hRes)) return hRes;

      return hRes;
}

void CTEST_EE_PlayMP3withMultSndCardsDlg::OnButton1()
{
      _Run();
}

void CTEST_EE_PlayMP3withMultSndCardsDlg::OnButton4()
{
      _Pause();
}

void CTEST_EE_PlayMP3withMultSndCardsDlg::OnButton3()
{
      _Stop();
}

HRESULT CTEST_EE_PlayMP3withMultSndCardsDlg::_Run()
{
      IMediaControlPtr pIMediaControl;
      HRESULT hRes;

      hRes = m_pGraphBuilder.QueryInterface(IID_IMediaControl, &pIMediaControl);

      if(SUCCEEDED(hRes)) hRes = pIMediaControl->Run();

      return hRes;
}

HRESULT CTEST_EE_PlayMP3withMultSndCardsDlg::_Pause()
{
      IMediaControlPtr pIMediaControl;
      HRESULT hRes;

      hRes = m_pGraphBuilder.QueryInterface(IID_IMediaControl, &pIMediaControl);

      if(SUCCEEDED(hRes)) hRes = pIMediaControl->Pause();

      return hRes;
}

HRESULT CTEST_EE_PlayMP3withMultSndCardsDlg::_Stop()
{
      IMediaControlPtr pIMediaControl;
      HRESULT hRes;

      hRes = m_pGraphBuilder.QueryInterface(IID_IMediaControl, &pIMediaControl);

      if(SUCCEEDED(hRes)) hRes = pIMediaControl->Stop();

      return hRes;
}

HRESULT CTEST_EE_PlayMP3withMultSndCardsDlg::_ReplaceAudioRenderer()
{
      HRESULT hRes;

      if(m_pAudioRenderer != NULL) {
            _Stop();                             // stop graph

            // disconnect input pin
            IEnumPinsPtr pIEnumPins;

            hRes = m_pAudioRenderer->EnumPins(&pIEnumPins);

            if(SUCCEEDED(hRes)) {
                  IPinPtr pIPin;
                  ULONG cFetched;

                  pIEnumPins->Reset();

                  while(pIEnumPins->Next(1, &pIPin, &cFetched) == S_OK) {
                        PIN_INFO pin_info;

                        hRes = pIPin->QueryPinInfo(&pin_info);

                        if(SUCCEEDED(hRes)) {
                              if(pin_info.dir == PINDIR_INPUT) {   // assuming that we have only one input pin
                                    IPinPtr pIPinConnectedTo;

                                    hRes = pIPin->ConnectedTo(&pIPinConnectedTo);

                                    if(SUCCEEDED(hRes)) {
                                          pIPin->Disconnect();                                 // disconnect audio renderer
                                          pIPinConnectedTo->Disconnect();

                                          m_pGraphBuilder->RemoveFilter(m_pAudioRenderer);     // remove audio renderer from graph
                                          m_pAudioRenderer.Release();

                                          hRes = pIPinConnectedTo->QueryPinInfo(&pin_info);

                                          if(SUCCEEDED(hRes)) {
                                                hRes = _AddAudioRendererToGraph();

                                                if(SUCCEEDED(hRes)) {
                                                      hRes = m_pCapBuilder->RenderStream(NULL, NULL, pin_info.pFilter, NULL, m_pAudioRenderer);
                                                };
                                          };
                                    };
      
                                    break;
                              };
                        };

                        pIPin.Release();
                  }
            };
      };

      return hRes;
}

void CTEST_EE_PlayMP3withMultSndCardsDlg::OnSelchangeCombo1()
{
      _ReplaceAudioRenderer();
}

HRESULT CTEST_EE_PlayMP3withMultSndCardsDlg::_AddAudioRendererToGraph()
{
      USES_CONVERSION;

      HRESULT hRes = E_FAIL;

      if(m_pAudioRenderer != NULL) m_pAudioRenderer.Release();

      INT nCurSelAudio = m_ctrlCBAudioRenderer.GetCurSel();

      if(nCurSelAudio >= 0) {
            IBaseFilter *pAudioRenderer = reinterpret_cast<IBaseFilter *>(m_ctrlCBAudioRenderer.GetItemData(nCurSelAudio));

            if(pAudioRenderer != NULL) {
                  CString strName;

                  m_ctrlCBAudioRenderer.GetLBText(nCurSelAudio, strName);
                  m_pAudioRenderer.Attach(pAudioRenderer, TRUE);
                  hRes = m_pGraphBuilder->AddFilter(m_pAudioRenderer, T2OLE((LPCTSTR)strName));
            };
      };

      return hRes;
}
0
 

Author Comment

by:jaxrpc
ID: 16998834
Thanks for the solution for directshow codes in C++.
0

Featured Post

Keep up with what's happening at Experts Exchange!

Sign up to receive Decoded, a new monthly digest with product updates, feature release info, continuing education opportunities, and more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Article by: SunnyDark
This article's goal is to present you with an easy to use XML wrapper for C++ and also present some interesting techniques that you might use with MS C++. The reason I built this class is to ease the pain of using XML files with C++, since there is…
Go is an acronym of golang, is a programming language developed Google in 2007. Go is a new language that is mostly in the C family, with significant input from Pascal/Modula/Oberon family. Hence Go arisen as low-level language with fast compilation…
The goal of the tutorial is to teach the user how to use functions in C++. The video will cover how to define functions, how to call functions and how to create functions prototypes. Microsoft Visual C++ 2010 Express will be used as a text editor an…
The goal of the video will be to teach the user the difference and consequence of passing data by value vs passing data by reference in C++. An example of passing data by value as well as an example of passing data by reference will be be given. Bot…
Suggested Courses

809 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question