|
Here are the two header and two cpp files. The code that is causing me problems is in the ListOfInstrumentsDlg::OnInitDialog() function at the bottom of this posting.
// Instrument.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CInstrument dialog
class CInstrument : public CDialog
{
// Construction
public:
CInstrument(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CInstrument)
enum { IDD = IDD_DIALOG_INSTRUMENT };
CString m_GPIB;
CString m_Name;
CString m_Type;
CString m_Channels;
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CInstrument)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CInstrument)
// NOTE: the ClassWizard will add member functions here
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_INSTRUMENT_H__E23BF332_8005_4295_B743_DDC7DC952923__INCLUDED_)
********************************************************
********************************************************
// Instrument.cpp : implementation file
//
#include "stdafx.h"
#include "ListOfInstruments.h"
#include "Instrument.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CInstrument dialog
CInstrument::CInstrument(CWnd* pParent /*=NULL*/)
: CDialog(CInstrument::IDD, pParent)
{
//{{AFX_DATA_INIT(CInstrument)
m_GPIB = _T("");
m_Name = _T("");
m_Type = _T("");
m_Channels = _T("");
//}}AFX_DATA_INIT
}
void CInstrument::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CInstrument)
DDX_Text(pDX, IDC_EDIT_GPIB, m_GPIB);
DDX_Text(pDX, IDC_EDIT_NAME, m_Name);
DDX_Text(pDX, IDC_EDIT_TYPE, m_Type);
DDX_Text(pDX, IDC_EDIT_CHANNELS, m_Channels);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CInstrument, CDialog)
//{{AFX_MSG_MAP(CInstrument)
// NOTE: the ClassWizard will add message map macros here
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
********************************************************
********************************************************
//
// ListOfInstrumentsDlg.h header file
#include "Instrument.h"
/////////////////////////////////////////////////////////////////////////////
// CListOfInstrumentsDlg dialog
class CListOfInstrumentsDlg : public CDialog
{
// Construction
public:
CListOfInstrumentsDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CListOfInstrumentsDlg)
enum { IDD = IDD_LISTOFINSTRUMENTS_DIALOG };
CListBox m_ListInstruments;
CString m_Transfer;
CString m_Add;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CListOfInstrumentsDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
CInstrument Inst;
private:
// CArray<cinstrument, cinstrument&=""> InstArray;
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CListOfInstrumentsDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnDblclkListInstruments();
afx_msg void OnBtnTransfer();
afx_msg void OnBtnAdd();
afx_msg void OnBtnDelete();
afx_msg void OnBtnNew();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_LISTOFINSTRUMENTSDLG_H__11140619_DB17_44D5_BA7D_0A965B24C920__INCLUDED_)
********************************************************
********************************************************
// ListOfInstrumentsDlg.cpp : implementation file
//
#include "stdafx.h"
#include "ListOfInstruments.h"
#include "ListOfInstrumentsDlg.h"
#include "NewInstrument.h"
//#include "Instrument.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()
/////////////////////////////////////////////////////////////////////////////
// CListOfInstrumentsDlg dialog
CListOfInstrumentsDlg::CListOfInstrumentsDlg(CWnd* pParent /*=NULL*/)
: CDialog(CListOfInstrumentsDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CListOfInstrumentsDlg)
m_Transfer = _T("");
m_Add = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CListOfInstrumentsDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CListOfInstrumentsDlg)
DDX_Control(pDX, IDC_LIST_INSTRUMENTS, m_ListInstruments);
DDX_Text(pDX, IDC_EDIT_TRANSFER, m_Transfer);
DDX_Text(pDX, IDC_EDIT_ADD, m_Add);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CListOfInstrumentsDlg, CDialog)
//{{AFX_MSG_MAP(CListOfInstrumentsDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_LBN_DBLCLK(IDC_LIST_INSTRUMENTS, OnDblclkListInstruments)
ON_BN_CLICKED(IDC_BTN_TRANSFER, OnBtnTransfer)
ON_BN_CLICKED(IDC_BTN_ADD, OnBtnAdd)
ON_BN_CLICKED(IDC_BTN_DELETE, OnBtnDelete)
ON_BN_CLICKED(IDC_BTN_NEW, OnBtnNew)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CListOfInstrumentsDlg message handlers
BOOL CListOfInstrumentsDlg::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
// TODO: Add extra initialization here
// CString* m_InstrumentType;
// CString* m_InstrumentName;
// CString* m_GPIB;
// CString* m_Channels;
CString* m_Comma;
CString* m_Return;
FILE* infile;
char* config_file = "Config.txt";
infile = fopen(config_file, "r");
int end_of_file = 0;
CInstrument Inst;
// Here is where the input read from the Config.txt file and stored in the respective variables.
while (!end_of_file)
{
fscanf(infile, "%[^,]", Inst.m_Type);
// fscanf(infile, "%[^,]", &m_InstrumentType);
fscanf(infile, "%[,]", &m_Comma);
fscanf(infile, "%[^,]", Inst.m_Name);
// fscanf(infile, "%[^,]", &m_InstrumentName);
fscanf(infile, "%[,]", &m_Comma);
fscanf(infile, "%[^,]", Inst.m_GPIB);
// fscanf(infile, "%[^,]", &m_GPIB);
fscanf(infile, "%[,]", &m_Comma);
fscanf(infile, "%[^\n]", Inst.m_Channels);
// fscanf(infile, "%[^\n]", &m_Channels);
fscanf(infile, "%[\n]", &m_Return);
// InstArray.Add();
if (feof(infile))
end_of_file = 1;
}
return TRUE; // return TRUE unless you set the focus to a control
}
Buck
|
|
|
|
|
Of immediate concern, and I think the ultimate cause, is that you are using the CString variables directly, without getting the buffers. This is overwriting the null string the CString variables point to by default.
You should do:
fscanf(infile, "%s", Inst.m_Type.GetBuffer(32));<br />
Inst.m_Type.ReleaseBuffer();
This is rather unsafe since it assumes it will read only 32 characters.
With VS 2007, you could do:
fscanf_s(infile, "%s", Inst.m_Type.GetBuffer(32), 32);<br />
Inst.m_Type.ReleaseBuffer();
If you know they are numbers, I'd use int s rather than CStrings and change the fscanf to:
fscanf(infile, "%d", &Inst.m_Type);
Anyone who thinks he has a better idea of what's good for people than people do is a swine.
- P.J. O'Rourke
-- modified at 17:14 Wednesday 22nd February, 2006
|
|
|
|
|
Thanks,
Because my file is comma delimited with variable length fields, some with white space in them I used the approach below. Works great!
Buck
CString in_buffer;
char buffer[32];
FILE* infile;
char* config_file = "Config.txt";
infile = fopen(config_file, "r");
int end_of_file = 0;
CInstrument Inst;
// Here is where the input read from the Config.txt file and stored in the respective variables.
while (!end_of_file)
{
fscanf(infile, "%[^,]", &buffer);
in_buffer.Format("%s", &buffer);
Inst.m_Type = in_buffer;
fscanf(infile, "%[,]", &buffer);
fscanf(infile, "%[^,]", &buffer);
in_buffer.Format("%s", &buffer);
Inst.m_Name = in_buffer;
fscanf(infile, "%[,]", &buffer);
fscanf(infile, "%[^,]", &buffer);
in_buffer.Format("%s", &buffer);
Inst.m_GPIB = in_buffer;
fscanf(infile, "%[,]", &buffer);
fscanf(infile, "%[^\n]", &buffer);
in_buffer.Format("%s", &buffer);
Inst.m_Channels = in_buffer;
fscanf(infile, "%[\n]", &buffer);
m_ListInstruments.AddString(Inst.m_Name);
if (feof(infile))
end_of_file = 1;
}
Buck
|
|
|
|
|
Maybe you could save yourself some duplicate effort.
Could you replace this:
fscanf(infile, "%[,]", &buffer);<br />
fscanf(infile, "%[^\n]", &buffer);<br />
in_buffer.Format("%s", &buffer);<br />
Inst.m_Channels = in_buffer;
with this, for example:
fscanf(infile, "%[,]", &buffer);<br />
fscanf(infile, "%[^\n]", &buffer);<br />
Inst.m_Channels.Format("%s", &buffer);
That is one less string copy and memory adjustment.
You would not need or use the in_buffer at all.
People that start writing code immediately are programmers (or hackers), people that ask questions first are Software Engineers - Graham Shanks
|
|
|
|
|
Difficult to say without seeing the code... Can you post it?
|
|
|
|
|
Here are the two header and two cpp files. The code that is causing me problems is in the ListOfInstrumentsDlg::OnInitDialog() function at the bottom of this posting.
// Instrument.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CInstrument dialog
class CInstrument : public CDialog
{
// Construction
public:
CInstrument(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CInstrument)
enum { IDD = IDD_DIALOG_INSTRUMENT };
CString m_GPIB;
CString m_Name;
CString m_Type;
CString m_Channels;
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CInstrument)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CInstrument)
// NOTE: the ClassWizard will add member functions here
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_INSTRUMENT_H__E23BF332_8005_4295_B743_DDC7DC952923__INCLUDED_)
********************************************************
********************************************************
// Instrument.cpp : implementation file
//
#include "stdafx.h"
#include "ListOfInstruments.h"
#include "Instrument.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CInstrument dialog
CInstrument::CInstrument(CWnd* pParent /*=NULL*/)
: CDialog(CInstrument::IDD, pParent)
{
//{{AFX_DATA_INIT(CInstrument)
m_GPIB = _T("");
m_Name = _T("");
m_Type = _T("");
m_Channels = _T("");
//}}AFX_DATA_INIT
}
void CInstrument::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CInstrument)
DDX_Text(pDX, IDC_EDIT_GPIB, m_GPIB);
DDX_Text(pDX, IDC_EDIT_NAME, m_Name);
DDX_Text(pDX, IDC_EDIT_TYPE, m_Type);
DDX_Text(pDX, IDC_EDIT_CHANNELS, m_Channels);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CInstrument, CDialog)
//{{AFX_MSG_MAP(CInstrument)
// NOTE: the ClassWizard will add message map macros here
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
********************************************************
********************************************************
//
// ListOfInstrumentsDlg.h header file
#include "Instrument.h"
/////////////////////////////////////////////////////////////////////////////
// CListOfInstrumentsDlg dialog
class CListOfInstrumentsDlg : public CDialog
{
// Construction
public:
CListOfInstrumentsDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CListOfInstrumentsDlg)
enum { IDD = IDD_LISTOFINSTRUMENTS_DIALOG };
CListBox m_ListInstruments;
CString m_Transfer;
CString m_Add;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CListOfInstrumentsDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
CInstrument Inst;
private:
// CArray<cinstrument, cinstrument&=""> InstArray;
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CListOfInstrumentsDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnDblclkListInstruments();
afx_msg void OnBtnTransfer();
afx_msg void OnBtnAdd();
afx_msg void OnBtnDelete();
afx_msg void OnBtnNew();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_LISTOFINSTRUMENTSDLG_H__11140619_DB17_44D5_BA7D_0A965B24C920__INCLUDED_)
********************************************************
********************************************************
// ListOfInstrumentsDlg.cpp : implementation file
//
#include "stdafx.h"
#include "ListOfInstruments.h"
#include "ListOfInstrumentsDlg.h"
#include "NewInstrument.h"
//#include "Instrument.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()
/////////////////////////////////////////////////////////////////////////////
// CListOfInstrumentsDlg dialog
CListOfInstrumentsDlg::CListOfInstrumentsDlg(CWnd* pParent /*=NULL*/)
: CDialog(CListOfInstrumentsDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CListOfInstrumentsDlg)
m_Transfer = _T("");
m_Add = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CListOfInstrumentsDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CListOfInstrumentsDlg)
DDX_Control(pDX, IDC_LIST_INSTRUMENTS, m_ListInstruments);
DDX_Text(pDX, IDC_EDIT_TRANSFER, m_Transfer);
DDX_Text(pDX, IDC_EDIT_ADD, m_Add);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CListOfInstrumentsDlg, CDialog)
//{{AFX_MSG_MAP(CListOfInstrumentsDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_LBN_DBLCLK(IDC_LIST_INSTRUMENTS, OnDblclkListInstruments)
ON_BN_CLICKED(IDC_BTN_TRANSFER, OnBtnTransfer)
ON_BN_CLICKED(IDC_BTN_ADD, OnBtnAdd)
ON_BN_CLICKED(IDC_BTN_DELETE, OnBtnDelete)
ON_BN_CLICKED(IDC_BTN_NEW, OnBtnNew)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CListOfInstrumentsDlg message handlers
BOOL CListOfInstrumentsDlg::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
// TODO: Add extra initialization here
// CString* m_InstrumentType;
// CString* m_InstrumentName;
// CString* m_GPIB;
// CString* m_Channels;
CString* m_Comma;
CString* m_Return;
FILE* infile;
char* config_file = "Config.txt";
infile = fopen(config_file, "r");
int end_of_file = 0;
CInstrument Inst;
// Here is where the input read from the Config.txt file and stored in the respective variables.
while (!end_of_file)
{
fscanf(infile, "%[^,]", Inst.m_Type);
// fscanf(infile, "%[^,]", &m_InstrumentType);
fscanf(infile, "%[,]", &m_Comma);
fscanf(infile, "%[^,]", Inst.m_Name);
// fscanf(infile, "%[^,]", &m_InstrumentName);
fscanf(infile, "%[,]", &m_Comma);
fscanf(infile, "%[^,]", Inst.m_GPIB);
// fscanf(infile, "%[^,]", &m_GPIB);
fscanf(infile, "%[,]", &m_Comma);
fscanf(infile, "%[^\n]", Inst.m_Channels);
// fscanf(infile, "%[^\n]", &m_Channels);
fscanf(infile, "%[\n]", &m_Return);
// InstArray.Add();
if (feof(infile))
end_of_file = 1;
}
return TRUE; // return TRUE unless you set the focus to a control
}
Buck
|
|
|
|
|
What does the fscanf() statement look like?
"Let us be thankful for the fools. But for them the rest of us could not succeed." - Mark Twain
|
|
|
|
|
Here are the two header and two cpp files. The code that is causing me problems is in the ListOfInstrumentsDlg::OnInitDialog() function.
// Instrument.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CInstrument dialog
class CInstrument : public CDialog
{
// Construction
public:
CInstrument(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CInstrument)
enum { IDD = IDD_DIALOG_INSTRUMENT };
CString m_GPIB;
CString m_Name;
CString m_Type;
CString m_Channels;
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CInstrument)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CInstrument)
// NOTE: the ClassWizard will add member functions here
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_INSTRUMENT_H__E23BF332_8005_4295_B743_DDC7DC952923__INCLUDED_)
********************************************************
********************************************************
// Instrument.cpp : implementation file
//
#include "stdafx.h"
#include "ListOfInstruments.h"
#include "Instrument.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CInstrument dialog
CInstrument::CInstrument(CWnd* pParent /*=NULL*/)
: CDialog(CInstrument::IDD, pParent)
{
//{{AFX_DATA_INIT(CInstrument)
m_GPIB = _T("");
m_Name = _T("");
m_Type = _T("");
m_Channels = _T("");
//}}AFX_DATA_INIT
}
void CInstrument::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CInstrument)
DDX_Text(pDX, IDC_EDIT_GPIB, m_GPIB);
DDX_Text(pDX, IDC_EDIT_NAME, m_Name);
DDX_Text(pDX, IDC_EDIT_TYPE, m_Type);
DDX_Text(pDX, IDC_EDIT_CHANNELS, m_Channels);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CInstrument, CDialog)
//{{AFX_MSG_MAP(CInstrument)
// NOTE: the ClassWizard will add message map macros here
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
********************************************************
********************************************************
//
// ListOfInstrumentsDlg.h header file
#include "Instrument.h"
/////////////////////////////////////////////////////////////////////////////
// CListOfInstrumentsDlg dialog
class CListOfInstrumentsDlg : public CDialog
{
// Construction
public:
CListOfInstrumentsDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CListOfInstrumentsDlg)
enum { IDD = IDD_LISTOFINSTRUMENTS_DIALOG };
CListBox m_ListInstruments;
CString m_Transfer;
CString m_Add;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CListOfInstrumentsDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
CInstrument Inst;
private:
// CArray<cinstrument, cinstrument&=""> InstArray;
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CListOfInstrumentsDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnDblclkListInstruments();
afx_msg void OnBtnTransfer();
afx_msg void OnBtnAdd();
afx_msg void OnBtnDelete();
afx_msg void OnBtnNew();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_LISTOFINSTRUMENTSDLG_H__11140619_DB17_44D5_BA7D_0A965B24C920__INCLUDED_)
********************************************************
********************************************************
// ListOfInstrumentsDlg.cpp : implementation file
//
#include "stdafx.h"
#include "ListOfInstruments.h"
#include "ListOfInstrumentsDlg.h"
#include "NewInstrument.h"
//#include "Instrument.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()
/////////////////////////////////////////////////////////////////////////////
// CListOfInstrumentsDlg dialog
CListOfInstrumentsDlg::CListOfInstrumentsDlg(CWnd* pParent /*=NULL*/)
: CDialog(CListOfInstrumentsDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CListOfInstrumentsDlg)
m_Transfer = _T("");
m_Add = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CListOfInstrumentsDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CListOfInstrumentsDlg)
DDX_Control(pDX, IDC_LIST_INSTRUMENTS, m_ListInstruments);
DDX_Text(pDX, IDC_EDIT_TRANSFER, m_Transfer);
DDX_Text(pDX, IDC_EDIT_ADD, m_Add);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CListOfInstrumentsDlg, CDialog)
//{{AFX_MSG_MAP(CListOfInstrumentsDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_LBN_DBLCLK(IDC_LIST_INSTRUMENTS, OnDblclkListInstruments)
ON_BN_CLICKED(IDC_BTN_TRANSFER, OnBtnTransfer)
ON_BN_CLICKED(IDC_BTN_ADD, OnBtnAdd)
ON_BN_CLICKED(IDC_BTN_DELETE, OnBtnDelete)
ON_BN_CLICKED(IDC_BTN_NEW, OnBtnNew)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CListOfInstrumentsDlg message handlers
BOOL CListOfInstrumentsDlg::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
// TODO: Add extra initialization here
// CString* m_InstrumentType;
// CString* m_InstrumentName;
// CString* m_GPIB;
// CString* m_Channels;
CString* m_Comma;
CString* m_Return;
FILE* infile;
char* config_file = "Config.txt";
infile = fopen(config_file, "r");
int end_of_file = 0;
CInstrument Inst;
// Here is where the input read from the Config.txt file and stored in the respective variables.
while (!end_of_file)
{
fscanf(infile, "%[^,]", Inst.m_Type);
// fscanf(infile, "%[^,]", &m_InstrumentType);
fscanf(infile, "%[,]", &m_Comma);
fscanf(infile, "%[^,]", Inst.m_Name);
// fscanf(infile, "%[^,]", &m_InstrumentName);
fscanf(infile, "%[,]", &m_Comma);
fscanf(infile, "%[^,]", Inst.m_GPIB);
// fscanf(infile, "%[^,]", &m_GPIB);
fscanf(infile, "%[,]", &m_Comma);
fscanf(infile, "%[^\n]", Inst.m_Channels);
// fscanf(infile, "%[^\n]", &m_Channels);
fscanf(infile, "%[\n]", &m_Return);
// InstArray.Add();
if (feof(infile))
end_of_file = 1;
}
return TRUE; // return TRUE unless you set the focus to a control
}
Buck
|
|
|
|
|
99% of this code is unnecessary to describe your problem. In the future, please try to trim away as much as you can before posting. That goes a long way in obtaining help.
BuckBrown wrote: FILE* infile;
char* config_file = "Config.txt";
Just curious, but why are you using FILE* and char* with MFC? It's syntactically correct, but not necessary.
BuckBrown wrote: fscanf(infile, "%[^,]", Inst.m_Type);
The first thing to do is separate CString from fscanf() . While they technically can be made to work together, it's messy and not worth the trouble.
char szText[128];
fscanf(infile, "%[^,]", szText);
Inst.m_Type = szText; BuckBrown wrote: fscanf(infile, "%[,]", &m_Comma);
This will never work as m_Comma is a pointer that does not point to a valid memory address. To eat the comma, just add it to the fscanf() statement:
fscanf(infile, "%[^,],", szText);
"Let us be thankful for the fools. But for them the rest of us could not succeed." - Mark Twain
|
|
|
|
|
i'm using plain winapi and i'm trying to find out which items are selected
in a multi-selection listview window. i need this for "remove all selected items"
functionality.
(1) i could walk down all items and check if an item is selected.
but that would take very long with big lists (linear time)
(2) i could also track selection changes inside the window procedure but
i guess this would slow down selecting/unselecting items noticebly.
also it would be a lot of extra coding.
isn't there some easy, fast and elegant way to get a list of all selected items?
a listbox provides a message for this - listview does not?
please help!
thanks in advance, sebastian
-------------------------------------------
My website: http://www.hartwork.org
|
|
|
|
|
My first guess would be to use LVM_FINDITEM to find selected items...
Be sure to turn off redrawing during the delete operations to improve performance.
Peace!
-=- James If you think it costs a lot to do it right, just wait until you find out how much it costs to do it wrong! Avoid driving a vehicle taller than you and remember that Professional Driver on Closed Course does not mean your Dumb Ass on a Public Road! DeleteFXPFiles & CheckFavorites (Please rate this post!)
|
|
|
|
|
thanks for your quick reply!
i overlooked LVM_FINDITEM somehow...
DavidCrow suggested LVM_GETNEXTITEM instead:
i compared these two and LVM_FINDITEM seems more
powerful so expect more speed from LVM_GETNEXTITEM .
also thanks for the tip on redrawing!
-------------------------------------------
My website: http://www.hartwork.org
|
|
|
|
|
Sebastian Pipping wrote: i need this for "remove all selected items"
functionality.
Make sure you delete from the bottom-up (e.g., largest item to the smallest item).
Sebastian Pipping wrote: (1) i could walk down all items and check if an item is selected.
but that would take very long with big lists (linear time)
Use the LVM_GETNEXTITEM message for this?
"Let us be thankful for the fools. But for them the rest of us could not succeed." - Mark Twain
|
|
|
|
|
thanks for you quick reply!
i am using LVM_GETNEXTITEM now.
i stumbled over the line "The specified item is itself excluded from the search"
on MSDN, and modified my code so it works with top-down deletion:
iWalk = SendMessage( _hView, LVM_GETNEXTITEM, iWalk - 1, LVNI_SELECTED );
-------------------------------------------
My website: http://www.hartwork.org
|
|
|
|
|
Hi ...
I have written a Windows Service using ATL COM (ATL3 / Visual Studio 6.0). The service works fine, I am able to start and stop the service.
I have created a COM Class called CTest with a methof called TestBeep(). I would like to access this object and call the method from the CServiceModule::Run() method.
Below is the CServiceModule::Run() Method.
The code will fail on both attempts to create the ITest* pTest using CoCreateInstance(). The error message are written to the event log
"Error: ITest failed"
"CoCreateInstance failed"
Any help is appreciated,
Thanks,
Chris
void CServiceModule::Run()<br />
{<br />
_Module.dwThreadID = GetCurrentThreadId();<br />
<br />
HRESULT hr = CoInitialize(NULL);<br />
<br />
_ASSERTE(SUCCEEDED(hr));<br />
<br />
CSecurityDescriptor sd;<br />
sd.InitializeFromThreadToken();<br />
hr = CoInitializeSecurity(sd, -1, NULL, NULL,<br />
RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);<br />
_ASSERTE(SUCCEEDED(hr));<br />
<br />
hr = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER, REGCLS_MULTIPLEUSE);<br />
_ASSERTE(SUCCEEDED(hr));<br />
<br />
LogEvent(_T("Blue Service started"));<br />
LogEvent(_T("Message 1"));<br />
LogEvent(_T("Message 2"));<br />
<br />
if (m_bService)<br />
SetServiceStatus(SERVICE_RUNNING);<br />
<br />
MSG msg;<br />
while (GetMessage(&msg, 0, 0, 0))<br />
DispatchMessage(&msg);<br />
<br />
_Module.RevokeClassObjects();<br />
<br />
<br />
<br />
char progID[] = "Blue.Test.1";<br />
<br />
CLSID clsid;<br />
wchar_t wide[80]; <br />
mbstowcs(wide, progID, 80);<br />
CLSIDFromProgID(wide, &clsid);<br />
<br />
LogEvent(_T("Attempt to use ITest"));<br />
<br />
ITest* pTest = NULL;<br />
if(SUCCEEDED(CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_ITest, (void**)&pTest)))<br />
{<br />
pTest->TestBeep(); <br />
}<br />
else<br />
{ <br />
LogEvent(_T("Error: ITest failed"));<br />
} <br />
<br />
<br />
<br />
CComPtr<ITest> pObj;<br />
hr = pObj.CoCreateInstance(OLESTR("Blue.Test.1"));<br />
if( SUCCEEDED(hr) )<br />
{<br />
hr = pObj->TestBeep();<br />
if( SUCCEEDED(hr) )<br />
{ <br />
LogEvent(_T("Call to ITest was successful"));<br />
}<br />
else<br />
{ <br />
LogEvent(_T("Error: ITest failed"));<br />
} <br />
}<br />
<br />
if( FAILED(hr) )<br />
{ <br />
LogEvent(_T("CoCreateInstance failed"));<br />
}<br />
<br />
CoUninitialize();<br />
}<br />
<br />
This is the implementation of the CTest Class and the TestBeep() method
<br />
#ifndef __TEST_H_<br />
#define __TEST_H_<br />
<br />
#include "resource.h"
<br />
class ATL_NO_VTABLE CTest : <br />
public CComObjectRootEx<CComSingleThreadModel>,<br />
public CComCoClass<CTest, &CLSID_Test>,<br />
public IDispatchImpl<ITest, &IID_ITest, &LIBID_BLUELib><br />
{<br />
public:<br />
CTest()<br />
{<br />
}<br />
<br />
DECLARE_REGISTRY_RESOURCEID(IDR_TEST)<br />
<br />
DECLARE_PROTECT_FINAL_CONSTRUCT()<br />
<br />
BEGIN_COM_MAP(CTest)<br />
COM_INTERFACE_ENTRY(ITest)<br />
COM_INTERFACE_ENTRY(IDispatch)<br />
END_COM_MAP()<br />
<br />
public:<br />
STDMETHOD(TestBeep)();<br />
STDMETHOD(GetCount)();<br />
int nCount;<br />
};<br />
<br />
#endif //__TEST_H_<br />
<br />
<br />
<br />
#include "stdafx.h"<br />
#include "Blue.h"<br />
#include "Test.h"<br />
<br />
<br />
<br />
STDMETHODIMP CTest::GetCount()<br />
{<br />
<br />
return S_OK;<br />
}<br />
<br />
STDMETHODIMP CTest::TestBeep()<br />
{<br />
Beep(4000, 200); <br />
Beep(1000, 50); <br />
Beep(4000, 200); <br />
Beep(1000, 50); <br />
return S_OK;<br />
}<br />
<br />
Thanks,
Chris
|
|
|
|
|
I want to take a bunch of unit test files from an LGPL opensource project, include them in my _closed_ project, modify them a bit and use it to test parts of my application. Can I do this?
thanks!
|
|
|
|
|
Chintoo723 wrote: Can I do this?
no[^].
You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
d)...
Cleek | Image Toolkits | Thumbnail maker
|
|
|
|
|
Chris Losinger wrote: copy and distribute such modifications or work under the terms of Section 1 above,
What does distribute here mean? who wants my work? where should I publish it to call it distributed?
Chris Losinger wrote: a) The modified work must itself be a software library.
As I said, it is only test modules which will be in a seperate .dsp project anways. Does this constitute a library in LGPL terms?
Chris Losinger wrote: You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
Same query as the first one. How should I go about it to make sure I am hiding anything from any third parties that want to use it.
thanks!
|
|
|
|
|
Chintoo723 wrote: What does distribute here mean?
the same thing it means anywhere else: if you give it, sell it or let anyone else use it, you're distributing it.
Chintoo723 wrote: How should I go about it to make sure I am hiding anything from any third parties that want to use it.
please, don't take this as legal advice... i'm not a lawyer
but, i think if anything you distribute (ie. let anyone else use outside your organization use) uses L/GPL code, you need to distribute all the code in that app/library. you can't break it up and put parts of it into closed-source apps or libraries.
the LGPL, as i understand it, lets you link LGPL libs into closed-source apps. but it doesn't let you use the code from those libs in closed-source apps.
Cleek | Image Toolkits | Thumbnail maker
|
|
|
|
|
If used only for testing, I believe you can. The key is that you won't be shipping any binaries from code covered by the LGPL.
Anyone who thinks he has a better idea of what's good for people than people do is a swine.
- P.J. O'Rourke
|
|
|
|
|
|
I have been looking for an answer on this one, but found only references to structures. Basically I have a VB.NET structure containing an member array of onother structure that has to be passed to unmanaged C++. I have been able to pass the structure which has members of type structure, but as soon as I define a member array of that structure I get an error: "An unhandled exception of type 'System.Runtime.InteropServices.COMException' occurred in mscorlib.dll
Additional information: The operation completed successfully."
This is how I am doing it:
VB.NET:
Public Structure SndStr2
<marshalas(unmanagedtype.i4)> Public memb1 As Integer
<marshalas(unmanagedtype.lpstr)> Public memb2 As String
<marshalas(unmanagedtype.i4)> Public memb3 As Integer
<marshalas(unmanagedtype.i4)> Public memb4 As Integer
End Structure
Public Structure SndStr1
<marshalas(unmanagedtype.i4)> Public memb1 As Integer
<marshalas(unmanagedtype.lpstr)> Public memb2 As String
<marshalas(unmanagedtype.i4)> Public memb3 As Integer
<marshalas(unmanagedtype.r8)> Public memb4 As Double
Public memb5() As SndStr2
End Structure
Declaration: Private Declare Function RcvFun Lib "...\RcvFun.dll" _
(ByRef SndVar As SndStr1) As String
Unmanaged C++:
struct RcvStr1 {
int memb1;
LPSTR memb2;
int memb3;
int memb4;
};
struct RcvStr2{
int memb1;
LPSTR memb2;
int memb3;
double memb4;
RcvStr1 *memb5;
};
LPSTR __declspec (dllexport) __stdcall RcvFun(RcvStr2 **RcvPtr)
{
RcvStr1 RcvVar1;
RcvVar1 = RcvPtr[0]->memb5[0];
return RcvVar1.memb2;
}
If there is anybody out there that did this before, please help!
-- modified at 12:05 Wednesday 22nd February, 2006
|
|
|
|
|
I have created a Listview box which would display data in the Report mode. When filling in the header columns is it possible to set the width to correctly display the full text string?
Most of the examples I have found on the net either give the width a static value or a percentage of the total. I would prefer it if I could simply find the length in dialog units or pixels of the max string to be displayed and set the width according to that.
So far I have found no function which is able to find the length of a string in this manner? Is there a method to doing this or would it be easier to do something like (chars_in_string * static_size)?
|
|
|
|
|
It's been a while since I did this, so if I don't get it exactly right, I apologize.
There is a member function of CListCtrl::GetStringWidth(), though I seem to recall it doesn't quite work as stated in the documentation. I seem to recall having to pad it slightly, but I may be mistaken.
Anyone who thinks he has a better idea of what's good for people than people do is a swine.
- P.J. O'Rourke
|
|
|
|
|
Following on from Joes comment above. Using the LVM_SETCOLUMNWIDTH[^] message, pass LVSCW_AUTOSIZE as the column width and the ListView will automaticaly resize the column to fit the longest string.
Gavin Taylor
w: http://www.gavspace.com
|
|
|
|
|