|
Thanks, but do you know of any tutorials that are pure C? That's what I'm writing my code in.
|
|
|
|
|
void RFX_Text_Bulk(
CFieldExchange* pFX,
LPCTSTR szName,
LPSTR* prgStrVals,
long** prgLengths,// show how to setup and implement
int nMaxLength
);
I need for someone to show me how to setup and implement this field " long** prgLengths"
all examples I've seen shows long* prgLengths in the header and prgLengths = NULL; in the constructor.
I tried that in my program and it came up with an error(compiler) that last two varables not implemented, meaning
long** prgLengths and int nMaxLength .
I have a CString that can at times greatly exceed the max of 255 char. That's why I need to implement the RFX_Text_Bulk function, but I can't find an example to show me how to do so.
Can anyone show me how with a working example. Please note that most times this varable will not be longer that 255 char, then there are times that it will!
A C++ programming language novice, but striving to learn
|
|
|
|
|
My best guess without reading the documentation:
CFieldExchange fieldX;
LPCTSTR szName[256];
LPSTR prgStrVals;
long* prgLengths;
int nMaxLength = 255;
RFX_Text_Bulk(&fieldX, szName, &prgStrVals, &prgLengths, nMaxLength);
Just provide the address of the variable that is a pointer to a long.
|
|
|
|
|
Sorry, that doesn't work. I thought the same thing. they want something for "prgLengths" but I don't know what. I've tried many examples shown through out the internet, but the errors remain.
A C++ programming language novice, but striving to learn
|
|
|
|
|
I took a look at the MSDN page[^] and think it should be something like this
CFieldExchange fieldX;
LPCTSTR pszName = "ColName";
LPSTR prgStrVals[nRows];
long prgLengths[nRows];
for (int i = 0; i < nRows; ++i)
{
prgStrVals[i] = (LPSTR)new char[256];
}
int nMaxLength = 256;
RFX_Text_Bulk(&fieldX, pszName, &prgStrVals, &prgLengths, nMaxLength);
The prgStrVals and prgLengths fields are arrays that will be filled by the function, so you need to pre-allocate enough for the number of rows you are transferring. Each entry in prgStrVals is a pointer to a buffer that will hold the data for the appropriate row, so each of these buffers must be long enough to hold the longest data item. The maximum length of the items to be stored is indicated by the nMaxLength field.
[edit]Added the link to the MSDN entry[/edit]
|
|
|
|
|
Please excuse my ignorance: This particular record only has one column data that requires at least 1024 chars so how do I set that colum up to receive and return 1024 chars (if that is the amount inputed? the column's varable is "m_Instructions", which is the "Preparation Instructions for a recipe.
please use this data in your explaination:
Note there are 58 varables in this record.
pszName = "Instructions";//Column header
prgStrVals = "m_Instructions"// varable
prgLengths = ???//don't know
nMaxLength = 1024;
RFX_Text_Bulk(fieldX, pszName, &prgStrVals, &prgLengths, nMaxLength);
A C++ programming language novice, but striving to learn
modified on Sunday, December 13, 2009 10:41 AM
|
|
|
|
|
Larry Mills Sr wrote: Please excuse my ignorance
No excuse needed, you are merely trying to learn.
I think the following should do it:
CFieldExchange fieldX;
LPCTSTR pszName = "Recipe";
int nRows = ?;
int nMaxLength = 1024;
LPSTR prgStrVals[nRows];
long prgLengths[nRows];
for (int i = 0; i < nRows; ++i)
{
prgStrVals[i] = (LPSTR)new char[nMaxLength];
}
RFX_Text_Bulk(&fieldX, pszName, &prgStrVals, &prgLengths, nMaxLength);
pszName is the name of the column in the data source; I'm not sure which that should be, but you will. The array prgStrVals needs to be lare enough to accept all the rows of data from the source (I guess there is some way of finding this value) and each entry is a pointer to a buffer of at least 1024 characters, as set in the for loop. On return if successful each entry in prgStrVals should contain the text from the corresponding row, and each entry in prgLengths should contain the length of that data.
|
|
|
|
|
Perhaps it would help if I enclosed my Recordset:
Recordset header(part):
LONG_PTR prgLengths;
int nMaxLength;
int nRows; // set this to the number of rows in the data
long m_ID;
CString m_Category;
CString m_RecipeName;
CString m_RecipeType;
CString m_FullFilePath;
CString m_Ingred1;
CString m_Amt1;
CString m_Unit1;
CString m_Ingred2;
CString m_Amt2;
CString m_Unit2;
CString m_Ingred3;
CString m_Amt3;
CString m_Unit3;
CString m_Ingred4;
CString m_Amt4;
CString m_Unit4;
CString m_Ingred5;
CString m_Amt5;
CString m_Unit5;
CString m_Ingred6;
CString m_Amt6;
CString m_Unit6;
CString m_Ingred7;
CString m_Amt7;
CString m_Unit7;
CString m_Ingred8;
CString m_Amt8;
CString m_Unit8;
CString m_Ingred9;
CString m_Amt9;
CString m_Unit9;
CString m_Ingred10;
CString m_Amt10;
CString m_Unit10;
CString m_Ingred11;
CString m_Amt11;
CString m_Unit11;
CString m_Ingred12;
CString m_Amt12;
CString m_Unit12;
CString m_Ingred13;
CString m_Amt13;
CString m_Unit13;
CString m_Ingred14;
CString m_Amt14;
CString m_Unit14;
CString m_Ingred15;
CString m_Amt15;
CString m_Unit15;
CString m_Instructions;
CString m_CookMethod;
CString m_Servings;
CString m_BitMapPath;
CString m_Extra1;
CString m_Extra2;
CString m_Extra3;
CString m_Extra4;
Initialized:
nRows = 0;
prgLengths = 1024;
nMaxLength = 1024;
m_ID = 0;
m_Category = "";
m_RecipeName = "";
m_RecipeType = "";
m_FullFilePath = "";
m_Ingred1 = "";
m_Amt1 = "";
m_Unit1 = "";
m_Ingred2 = "";
m_Amt2 = "";
m_Unit2 = "";
m_Ingred3 = "";
m_Amt3 = "";
m_Unit3 = "";
m_Ingred4 = "";
m_Amt4 = "";
m_Unit4 = "";
m_Ingred5 = "";
m_Amt5 = "";
m_Unit5 = "";
m_Ingred6 = "";
m_Amt6 = "";
m_Unit6 = "";
m_Ingred7 = "";
m_Amt7 = "";
m_Unit7 = "";
m_Ingred8 = "";
m_Amt8 = "";
m_Unit8 = "";
m_Ingred9 = "";
m_Amt9 = "";
m_Unit9 = "";
m_Ingred10 = "";
m_Amt10 = "";
m_Unit10 = "";
m_Ingred11 = "";
m_Amt11 = "";
m_Unit11 = "";
m_Ingred12 = "";
m_Amt12 = "";
m_Unit12 = "";
m_Ingred13 = "";
m_Amt13 = "";
m_Unit13 = "";
m_Ingred14 = "";
m_Amt14 = "";
m_Unit14 = "";
m_Ingred15 = "";
m_Amt15 = "";
m_Unit15 = "";
m_Instructions = "";
m_CookMethod = "";
m_Servings = "";
m_BitMapPath = "";
m_Extra1 = "";
m_Extra2 = "";
m_Extra3 = "";
m_Extra4 = "";
m_nFields = 58;
//m_nDefaultType = dynaset;
m_nDefaultType = snapshot;
void CMyDB::DoFieldExchange(CFieldExchange* pFX)
{
pFX->SetFieldType(CFieldExchange::outputColumn);
// Macros such as RFX_Text() and RFX_Int() are dependent on the
// type of the member variable, not the type of the field in the database.
// ODBC will try to automatically convert the column value to the requested type
RFX_Long(pFX, _T("[ID]"), m_ID);
RFX_Text(pFX, _T("[Category]"), m_Category);
RFX_Text(pFX, _T("[RecipeName]"), m_RecipeName);
RFX_Text(pFX, _T("[RecipeType]"), m_RecipeType);
RFX_Text(pFX, _T("[FullFilePath]"), m_FullFilePath);
RFX_Text(pFX, _T("[Ingred1]"), m_Ingred1);
RFX_Text(pFX, _T("[Amt1]"), m_Amt1);
RFX_Text(pFX, _T("[Unit1]"), m_Unit1);
RFX_Text(pFX, _T("[Ingred2]"), m_Ingred2);
RFX_Text(pFX, _T("[Amt2]"), m_Amt2);
RFX_Text(pFX, _T("[Unit2]"), m_Unit2);
RFX_Text(pFX, _T("[Ingred3]"), m_Ingred3);
RFX_Text(pFX, _T("[Amt3]"), m_Amt3);
RFX_Text(pFX, _T("[Unit3]"), m_Unit3);
RFX_Text(pFX, _T("[Ingred4]"), m_Ingred4);
RFX_Text(pFX, _T("[Amt4]"), m_Amt4);
RFX_Text(pFX, _T("[Unit4]"), m_Unit4);
RFX_Text(pFX, _T("[Ingred5]"), m_Ingred5);
RFX_Text(pFX, _T("[Amt5]"), m_Amt5);
RFX_Text(pFX, _T("[Unit5]"), m_Unit5);
RFX_Text(pFX, _T("[Ingred6]"), m_Ingred6);
RFX_Text(pFX, _T("[Amt6]"), m_Amt6);
RFX_Text(pFX, _T("[Unit6]"), m_Unit6);
RFX_Text(pFX, _T("[Ingred7]"), m_Ingred7);
RFX_Text(pFX, _T("[Amt7]"), m_Amt7);
RFX_Text(pFX, _T("[Unit7]"), m_Unit7);
RFX_Text(pFX, _T("[Ingred8]"), m_Ingred8);
RFX_Text(pFX, _T("[Amt8]"), m_Amt8);
RFX_Text(pFX, _T("[Unit8]"), m_Unit8);
RFX_Text(pFX, _T("[Ingred9]"), m_Ingred9);
RFX_Text(pFX, _T("[Amt9]"), m_Amt9);
RFX_Text(pFX, _T("[Unit9]"), m_Unit9);
RFX_Text(pFX, _T("[Ingred10]"), m_Ingred10);
RFX_Text(pFX, _T("[Amt10]"), m_Amt10);
RFX_Text(pFX, _T("[Unit10]"), m_Unit10);
RFX_Text(pFX, _T("[Ingred11]"), m_Ingred11);
RFX_Text(pFX, _T("[Amt11]"), m_Amt11);
RFX_Text(pFX, _T("[Unit11]"), m_Unit11);
RFX_Text(pFX, _T("[Ingred12]"), m_Ingred12);
RFX_Text(pFX, _T("[Amt12]"), m_Amt12);
RFX_Text(pFX, _T("[Unit12]"), m_Unit12);
RFX_Text(pFX, _T("[Ingred13]"), m_Ingred13);
RFX_Text(pFX, _T("[Amt13]"), m_Amt13);
RFX_Text(pFX, _T("[Unit13]"), m_Unit13);
RFX_Text(pFX, _T("[Ingred14]"), m_Ingred14);
RFX_Text(pFX, _T("[Amt14]"), m_Amt14);
RFX_Text(pFX, _T("[Unit14]"), m_Unit14);
RFX_Text(pFX, _T("[Ingred15]"), m_Ingred15);
RFX_Text(pFX, _T("[Amt15]"), m_Amt15);
RFX_Text(pFX, _T("[Unit15]"), m_Unit15);
RFX_Text_Bulk(pFX, _T("[Instructions]"), (LPSTR *)&m_Instructions,(long**)prgLengths,nMaxLength);//doesn't work
RFX_Text(pFX, _T("[CookMethod]"), m_CookMethod);
RFX_Text(pFX, _T("[Servings]"), m_Servings);
RFX_Text(pFX, _T("[BitMapPath]"), m_BitMapPath);
RFX_Text(pFX, _T("[Extra1]"), m_Extra1);
RFX_Text(pFX, _T("[Extra2]"), m_Extra2);
RFX_Text(pFX, _T("[Extra3]"), m_Extra3);
RFX_Text(pFX, _T("[Extra4]"), m_Extra4);
}
I do not understand this:
for (int i = 0; i < nRows; ++i)
{
prgStrVals[i] = (LPSTR)new char[nMaxLength];
}
There is only ONE Column's data that will be greater (at times) than 255 chars. That column is "Instructions"
how do I set that up? Please excuse my ignorance(again)
A C++ programming language novice, but striving to learn
|
|
|
|
|
Larry Mills Sr wrote: RFX_Text_Bulk(pFX, _T("[Instructions]"), (LPSTR *)&m_Instructions,(long**)prgLengths,nMaxLength);//doesn't work
I think you are trying to make something that which it is not, by the use of casts; if you'll pardon my circumlocution.
The third field of the RFX_Text_Bulk() call must be "A pointer to an array of LPSTR values", as defined in my previous post. The for loop initialises each entry to a buffer that can hold up to the maximum length of data for the column in question. However you are trying to cast the address of a CString to an array of pointers, which will not work.
However, having looked again at what you are doing I am getting the feeling that the RFX_Text_Bulk() call is not what you need, you should be using the RFX_Text() call, the same as all the other fields, but with a nMaxLength value thus:
RFX_Text(pFX, _T("[Instructions]"), m_Instructions, 1024);
I guess you may have been confused by the definition on the MSDN page[^]. Where it says int nMaxLength = 255, in the function definition, which just means that if you do not specifiy a value for this field the compiler will automatically use 255. You are still at liberty to use a smaller or larger value in the range [1 to INT_MAX].
|
|
|
|
|
I tried that, and while it gave me no errors; it also DID NOT put all the data from m_Instructions into the database (It has the data in the varable before calling Update();)
A C++ programming language novice, but striving to learn
|
|
|
|
|
Larry Mills Sr wrote: I tried that, and while it gave me no errors; it also DID NOT put all the data from m_Instructions into the database (It has the data in the varable before calling Update();)
Well I'm afraid I'm a bit lost now as I thought you were trying to read data out of the database. I cannot see anything wrong with the last set of calls unless you are doing it in the wrong direction somehow.
|
|
|
|
|
Larry Mills Sr wrote: it also DID NOT put all the data from m_Instructions into the database (It has the data in the varable before calling Update();)
Well having slept on this I guess we are now into a new problem. May I suggest you post as a new question showing how you are trying the database update and how your program variables map to the database fields. I know there are a lot of very smart DB experts on this site so I'm sure one of them will pick it up quite quickly.
|
|
|
|
|
Because of the prior code listing I'll post all the code here.
How I write to the DB
void CCookItDBDoc::OnRecordNew(CRecipeData cData, int nIndex)
{
m_cRecipeData.CleanUp();
m_cRecipeData = cData;
//CheckStrSize();
//m_CookItDBSet.CleanUp();
TRY
{
if (m_CookItDBSet.Open(CRecordset::dynaset, NULL, CRecordset::appendOnly))
{
m_CookItDBSet.AddNew();
if(nIndex == 0)
{
m_CookItDBSet.m_ID = 1;
}
//nRecord = m_CookItDBSet.m_ID;
//m_CookItDBSet.CleanUp();
m_CookItDBSet.m_Category = m_cRecipeData.m_csCategory;
m_CookItDBSet.m_RecipeName = m_cRecipeData.m_csRecipeName;
m_CookItDBSet.m_RecipeType = m_cRecipeData.m_csRecipeType;
m_CookItDBSet.m_FullFilePath = m_cRecipeData.m_csFullFilePath;
m_CookItDBSet.m_Ingred1 = m_cRecipeData.m_csIngred1;
m_CookItDBSet.m_Amt1 = m_cRecipeData.m_csAmt1;
m_CookItDBSet.m_Unit1 = m_cRecipeData.m_csUnit1;
m_CookItDBSet.m_Ingred2 = m_cRecipeData.m_csIngred2;
m_CookItDBSet.m_Amt2 = m_cRecipeData.m_csAmt2;
m_CookItDBSet.m_Unit2 = m_cRecipeData.m_csUnit2;
m_CookItDBSet.m_Ingred3 = m_cRecipeData.m_csIngred3;
m_CookItDBSet.m_Amt3 = m_cRecipeData.m_csAmt3;
m_CookItDBSet.m_Unit3 = m_cRecipeData.m_csUnit3;
m_CookItDBSet.m_Ingred4 = m_cRecipeData.m_csIngred4;
m_CookItDBSet.m_Amt4 = m_cRecipeData.m_csAmt4;
m_CookItDBSet.m_Unit4 = m_cRecipeData.m_csUnit4;
m_CookItDBSet.m_Ingred5 = m_cRecipeData.m_csIngred5;
m_CookItDBSet.m_Amt5 = m_cRecipeData.m_csAmt5;
m_CookItDBSet.m_Unit5 = m_cRecipeData.m_csUnit5;
m_CookItDBSet.m_Ingred6 = m_cRecipeData.m_csIngred6;
m_CookItDBSet.m_Amt6 = m_cRecipeData.m_csAmt6;
m_CookItDBSet.m_Unit6 = m_cRecipeData.m_csUnit6;
m_CookItDBSet.m_Ingred7 = m_cRecipeData.m_csIngred7;//23
m_CookItDBSet.m_Amt7 = m_cRecipeData.m_csAmt7;
m_CookItDBSet.m_Unit7 = m_cRecipeData.m_csUnit7;
m_CookItDBSet.m_Ingred8 = m_cRecipeData.m_csIngred8;
m_CookItDBSet.m_Amt8 = m_cRecipeData.m_csAmt8;
m_CookItDBSet.m_Unit8 = m_cRecipeData.m_csUnit8;//28
m_CookItDBSet.m_Ingred9 = m_cRecipeData.m_csIngred9;
m_CookItDBSet.m_Amt9 = m_cRecipeData.m_csAmt9;
m_CookItDBSet.m_Unit9 = m_cRecipeData.m_csUnit9;
m_CookItDBSet.m_Ingred10 = m_cRecipeData.m_csIngred10;
m_CookItDBSet.m_Amt10 = m_cRecipeData.m_csAmt10;
m_CookItDBSet.m_Unit10 = m_cRecipeData.m_csUnit10;
m_CookItDBSet.m_Ingred11 = m_cRecipeData.m_csIngred11;
m_CookItDBSet.m_Amt11 = m_cRecipeData.m_csAmt11;
m_CookItDBSet.m_Unit11 = m_cRecipeData.m_csUnit11;
m_CookItDBSet.m_Ingred12 = m_cRecipeData.m_csIngred12;
m_CookItDBSet.m_Amt12 = m_cRecipeData.m_csAmt12;
m_CookItDBSet.m_Unit12 = m_cRecipeData.m_csUnit12;
m_CookItDBSet.m_Ingred13 = m_cRecipeData.m_csIngred13;
m_CookItDBSet.m_Amt13 = m_cRecipeData.m_csAmt13;
m_CookItDBSet.m_Unit13 = m_cRecipeData.m_csUnit13;
m_CookItDBSet.m_Ingred14 = m_cRecipeData.m_csIngred14;
m_CookItDBSet.m_Amt14 = m_cRecipeData.m_csAmt14;
m_CookItDBSet.m_Unit14 = m_cRecipeData.m_csUnit14;
m_CookItDBSet.m_Ingred15 = m_cRecipeData.m_csIngred15;
m_CookItDBSet.m_Amt15 = m_cRecipeData.m_csAmt15;
m_CookItDBSet.m_Unit15 = m_cRecipeData.m_csUnit15;
m_CookItDBSet.m_Instructions = m_cRecipeData.m_csInstructions;//not saving 1024 char
m_CookItDBSet.m_CookMethod = m_cRecipeData.m_csCookMethod;
m_CookItDBSet.m_Servings = m_cRecipeData.m_csServings;
m_CookItDBSet.m_BitMapPath = m_cRecipeData.m_csBitMapPath;
m_CookItDBSet.m_Extra1 = m_cRecipeData.m_csExtra1;
m_CookItDBSet.m_Extra2 = m_cRecipeData.m_csExtra2;//55
m_CookItDBSet.m_Extra3 = m_cRecipeData.m_csExtra3;
m_CookItDBSet.m_Extra4 = m_cRecipeData.m_csExtra4;
SetID(m_CookItDBSet.m_ID);
m_CookItDBSet.Update();
m_CookItDBSet.Close();
//UpdateAllViews(NULL);
}//if
}//TRY
CATCH(CDBException, pDBException)
{
AfxMessageBox(pDBException->m_strError);
}//CATCH
END_CATCH
}
The m_CookItDBSet.m_Instructions varable has all the data in it before the m_CookItDBSet.Update(); function is called, but checking the database in MS Access most of the data for Instructions is gone.
A C++ programming language novice, but striving to learn
|
|
|
|
|
I'm afraid I have nothing to suggest now as this appears to be a database issue, and my DB skills are minimal at best. As I suggested earier I think you should start a new thread in the Database forum and see if one of the experts can help.
|
|
|
|
|
I create a SDI application,which deals with ODBC. When I debug the application, so weired thing happens.
In MainFrm.cpp,the application run into CMainFrame::OnCreate function. When it comes to CFrameWnd::OnCreate function, the application is paused.Detailed information is below.
Prompt information on popup dialog shows a breakpoint is trigged. The output window says Invalid Address specified to RtlValidateHeap( 00E30000, 00E36918 ). The application finally stops at the following positon.
~CSimpleStringT() throw()
{
CStringData* pData = GetData();
pData->Release();
} (<atlsimpstr.h>)
Before CFrameWnd::OnCreate function,code is generated by mfc classwizard.I don't do anything, including memory operation. So I don't know why this happens.
Due these code executed comes from mfc classwizard, I create a new SID project without ODBC. Configures excepte database function are the same as the former one. This application works properly. After debugging these two application by step for CFrameWnd::OnCreate function, I find one difference. When it comes to the statement
if (!pView->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
CRect(0,0,0,0), this, nID, pContext)) (<winfrm.cpp>)
the former application goes into CFormView::Create, while the latter one goes into CWnd::Create. I don't know whether the problem is here.
Hope someone could give me some clues or solution,thanks in advance.
If my description is unclear or undetailed, please let me know. Thanks a lot.
|
|
|
|
|
You should use your debugger and see where the code crashes exactly (using the call stack, you can track it to your code). Inspect the different at that time and see if something is not as it should be. If you are still stuck, post the code snippet which is causing troubles.
|
|
|
|
|
Thanks for your respond.
The application crashed when run the code generated by MFC application wizard.
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
return 0;
}
You know that above code snippet is generated by MFC wizard.
When the application stuck, information displayed in call stack window is as follows
---------
msvcr80d.dll!_free_base(void * pBlock=0x003b0000) line 109 + 0x13 byte
msvcr80d.dll!_CrtIsValidHeapPointer(const void * pUserData=0x003b9470) line 1963
msvcr80d.dll!_free_dbg_nolock(void * pUserData=0x003b9470, int nBlockUse=1) line 1252 + 0x9 byte
msvcr80d.dll!_free_dbg(void * pUserData=0x003b9470, int nBlockUse=1) line 1194 + 0xd bytes
mfc80ud.dll!COccManager::PostCreateDialog(_AFX_OCC_DIALOG_INFO * pDlgInfo=0x0012f02c) line 237 + 0xf byte
mfc80ud.dll!CWnd::CreateDlgIndirect(const DLGTEMPLATE * lpDialogTemplate=0x00417e40, CWnd * pParentWnd=0x003bdbc8, HINSTANCE__ * hInst=0x00400000) line 323
mfc80ud.dll!CWnd::CreateDlg(const wchar_t * lpszTemplateName=0x00000065, CWnd * pParentWnd=0x003bdbc8) line 226 + 0x14 byte
mfc80ud.dll!CFormView::Create(const wchar_t * __formal=0x00000000, const wchar_t * __formal=0x00000000, unsigned long dwRequestedStyle=1350565888, const tagRECT & rect={...}, CWnd * pParentWnd=0x003bdbc8, unsigned int nID=59648, CCreateContext * pContext=0x0012fce4) line 101 + 0x16 byte
mfc80ud.dll!CFrameWnd::CreateView(CCreateContext * pContext=0x0012fce4, unsigned int nID=59648) line 590 + 0x33 byte
mfc80ud.dll!CFrameWnd::OnCreateClient(tagCREATESTRUCTW * __formal=0x0012f518, CCreateContext * pContext=0x0012fce4) line 611 + 0x11 byte
mfc80ud.dll!CFrameWnd::OnCreateHelper(tagCREATESTRUCTW * lpcs=0x0012f518, CCreateContext * pContext=0x0012fce4) line 630 + 0x18 byte
mfc80ud.dll!CFrameWnd::OnCreate(tagCREATESTRUCTW * lpcs=0x0012f518) line 622
LiqStoreDB.exe!CMainFrame::OnCreate(tagCREATESTRUCTW * lpCreateStruct=0x0012f518) line 62 + 0xc byte
---------
I feel the call stack information give me little clue. It is only related to MFC itself. I have no idea for further solution.
Need to mention that the MFC application with SDI deal with ODBC.
When creating a SDI MFC application only by wizard with the same configuration and compilation environment, no exception ocurrs. So I guess if I miss something when dealing with ODBC.
Anyone ever experienced this situation, please help me out. Thanks a lot.
|
|
|
|
|
HI!
I can't get MAC by GetAdaptersAddresses .
Here is the code:
void CGetAdepterInfoDlg::GetInfo(void)
{
PIP_ADAPTER_ADDRESSES pAddresses;
pAddresses = new IP_ADAPTER_ADDRESSES;
ULONG outBufLen = 0;
DWORD dwRetVal = 0;
if (GetAdaptersAddresses(AF_INET, 0, NULL, pAddresses, &outBufLen) == ERROR_BUFFER_OVERFLOW)
{
delete pAddresses;
pAddresses = (IP_ADAPTER_ADDRESSES*) malloc(outBufLen);
}
if ((dwRetVal = GetAdaptersAddresses(AF_INET, 0, NULL, pAddresses, &outBufLen)) == NO_ERROR)
{
while (pAddresses)
{
if (pAddresses->PhysicalAddressLength != 0)
{
CString sm;
sm.Format(_T("%x"),pAddresses->PhysicalAddress);
this->MessageBox(sm);
}
pAddresses = pAddresses->Next;
}
}
}
void CGetAdepterInfoDlg::OnBnClickedButton1()
{
this->GetInfo();
}
THANKS!
David
modified on Saturday, December 12, 2009 11:47 AM
|
|
|
|
|
Give me a hand please!
|
|
|
|
|
DavidBrother wrote: Give me a hand please!
Be patient! If anyone has the answer they will post it in their own time.
|
|
|
|
|
DavidBrother wrote: sm.Format(_T("%x"),pAddresses->PhysicalAddress);
PhysicalAddress is an array of bytes; you are converting the first part of its offset value to hex. You need to format each byte of the array in turn.
|
|
|
|
|
Thanks!
Richard MacCutchan
Let me try.
I feel this is a little hard function.
|
|
|
|
|
Thank you very much!
now it works!
|
|
|
|
|
Hello,
I need to send data over an active dialup conenction. So I had a look at the TAPI and also
at RasDial. I couldnt find functions like Write(...) to send data with an open tapi line
or rasdial connection.
I want to call a gsm-modem that is connected to a measurement device on the serial port.
Then I want to read and write data with this connection. I had a look at the samples about
tapi, but they are often about opening lines and making calls. I havnt found information
about sending and reading just data with a dialup connection.
Can anyone help me please ?
best regards,
cmos
|
|
|
|
|
|