|
Hi
I’m again having different results in debug and release this one isn’t a bug but different program behavior.
I have 4 CwinThread Wrappers for CAsynSocket
In debug because processing is slowed somewhat by int 3 breakpoints I Receive all my about 3500 bytes of data from the Mainframe computer. In release I don’t get it all in one transmission I have a full word or a short int in the begging of the stream to tell me how much data
My method to debug this in the past was issue a AfxMessage and attach the debugger
This always seemed to work with the Mainthread
I didn’t even notice the message box come up in this scenario except by hovering my mouse on the tray at the bottom of the screen I don’t think I can use __debugbreak in Release
Anyway to stop this thread so that I can attach the debugger to see what’s going on
I forgot to add this UI thread was created before I created the CMainFrame Window however in the past I was able to have an AfxMessageBox in the CWinApp constructor and it worked
Thanks
modified 6-Dec-18 10:10am.
|
|
|
|
|
Why are you using AfxMessageBox in a secondary thread?
|
|
|
|
|
Will use Message box establish my main window before thread creation and will move the CFrameWnd ::m_hWnd to UI thread window thanks
|
|
|
|
|
It is not a good design to display a messagebox form any secondary thread.
Better would be PostMessage a user defined message to the main GUI thread with the parameters that you want to be displayed and let the main thread display it.
|
|
|
|
|
This is just to debug a scenario that only happen in release I have to have a way of stopping the thread in release and attaching the debugger if there is a better way please share thanks
|
|
|
|
|
How can I get all keyboard functionality for IExplorerBrowser[^] in a MFC app ? I have context menu options available for mouse, but not for keyboard (Ctrl+C, Ctrl+V, Ctrl+A, etc.). Is there any method to have these commands in my app ? I am pretty sure that is possible, but I don't know how
modified 6-Dec-18 3:47am.
|
|
|
|
|
These lines in My DrawItem Api are causing the heap corruption
if(arrayptr[pdi->itemID] == NULL)
arrayptr[pdi->itemID] = new char(9);
memset(arrayptr[pdi->itemID], 0x00, 9);
memcpy(arrayptr[pdi->itemID], lpszText, 8);
Don't understand it as I allocated everything on the Heap
|
|
|
|
|
Quote: arrayptr[pdi->itemID] = new char(9);
Should be
arrayptr[pdi->itemID] = new char[9];
|
|
|
|
|
WOW thanks good catch I didn't see however where the storage was initialized to 9 let me try
thanks
|
|
|
|
|
|
You are welcome.
Did you really need to use raw (C -like) arrays and new ?
|
|
|
|
|
I am MainFrame programmer by trade wasn't sure how to copy the first 8 characters of the 45 character strings
Thanks
|
|
|
|
|
I missed that twice in the original thread below. Well spotted.
|
|
|
|
|
Thank you, Richard.
|
|
|
|
|
Hi
I Decided to start a new thread because for a moment I thought I had fixed my problem of the Disappearing list with the following code
I added a point to an array pointer for the strings I wanted to add
class Casidcombo : public CComboBox
{
DECLARE_DYNAMIC(Casidcombo)
private:
int cright, cbottom, ctop;
public:
Casidcombo();
~Casidcombo();
char **arrayptr;
protected:
virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
virtual void DrawItem(LPDRAWITEMSTRUCT pdi);
virtual int CompareItem(LPCOMPAREITEMSTRUCT lpCompareItemStruct);
virtual void DeleteItem(LPDELETEITEMSTRUCT lpDeleteItemStruct);
DECLARE_MESSAGE_MAP()
};
its the arrayptr not knowing exactly how may entries I would have I initialize it in the
OnInitDialogBox of the the Hosting Dialog
m_Simple.arrayptr = new char *[j+1];
for (int i = 0; i < j + 1; i++)
m_Simple.arrayptr[i] = NULL;
In the DrawItem For The Combobox I copy of over part of the string
if(arrayptr[pdi->itemID] == NULL)
arrayptr[pdi->itemID] = new char(9);
memset(arrayptr[pdi->itemID], 0x00, 9);
memcpy(arrayptr[pdi->itemID], lpszText, 8);
I then write it out
dc.DrawText(
arrayptr[pdi->itemID],
8,
&pdi->rcItem,
DT_CENTER | DT_SINGLELINE | DT_VCENTER);
The list now re-appears After I try closing out the Dialog by clicking on the 'X'
in the right hand Corner
I guess this drives the DrawItem function
My question is after appearing and disappearing initially (the list) of the ComboBox the vertical scroll bar is missing as well until I clisk on the 'X' in the right hand corner after which everything re-appears I guess that most Drive DrawItem I am still Baffled Why initially it disappears along with the scroll bar
This the last piece of code in the OnInitDialog
ShowWindow(SW_SHOW);
ShowWindow(SW_SHOW);
return TRUE;
This is my message map I only have a Measure Item Message
BEGIN_MESSAGE_MAP(Casidcombo, CComboBox)
ON_WM_MEASUREITEM()
END_MESSAGE_MAP()
modified 4-Dec-18 22:16pm.
|
|
|
|
|
I have used user drawn ListView controls without problem in the past. I notice that you are using a CDC to draw the text in the view rather than responding to the notification messages and returning the relevant data. However, my sample does not use MFC so I may well be on the wrong track.
|
|
|
|
|
Richard there are two api in DrawItem that are not supported in Native Win32 FillSolidRect only thing close is FillRect which takes a brush
Regardless I was getting a heap corruption so I ran my code in debug with the following
#if _DEBUG
afxMemDF = allocMemDF | checkAlwaysMemDF;
#endif
and at exiting DrawItem got the following
#if defined _NO_CRT_STDIO_INLINE
;
#else
{
int const _Result = __stdio_common_vsnprintf_s(
_CRT_INTERNAL_LOCAL_PRINTF_OPTIONS,
_Buffer, _BufferCount, _MaxCount, _Format, _Locale, _ArgList);
return _Result < 0 ? -1 : _Result;
}
#endif
Exiting DrawItem I am getting a heap corruption
|
|
|
|
|
You need to actually trace the code to see where the heap is getting corrupted. It is usually caused by writing too many bytes into an allocated buffer. Notice that __stdio_common_vsnprintf_s takes two values which indicate the length, so one of them could be wrong.
|
|
|
|
|
I Did but I don't understand why
I am getting a list of Addreess Spaces information from z/os I only want to Add the the list box the Job Name. Asid information is 45 bytes the first 8 is the JobName. So the First would be *Master*
I moved the code which copies the first 8 charcates from CComboBox::DrawItem to the DialogBox
just got Debug Assert on the AddString I think I am doing everything right;
m_Simple.arrayptr = new char *[j+1];
traverse = instr;
for (int i = 0; i < j + 1; i++)
{
m_Simple.arrayptr[i] = new char(9);
memset(m_Simple.arrayptr[i], 0x00, 9);
memcpy(m_Simple.arrayptr[i], traverse, 8);
m_Simple.AddString(m_Simple.arrayptr[i]);
traverse = (char *)traverse + 45;
}
The twisted Arrow after the Debug Heap Assertion is pointing to
traverse = (char *)traverse + 45
So I guess there is a problem with AddString
Not sure what I am doing wrong
|
|
|
|
|
I can only assume that your instr variable does not contain the number of 45 character fields that you think. However only the debugger could confirm that.
|
|
|
|
|
I am getting
undefined reference error.
I have "included " relevant headers in souce files , I have "common path" in project includes (/usr/include /bluetooth ) ,
I can access "Open Declaration" in my IDE and it identifies function and its file...
I have no errors indicating missing
bluetooth/hci_lib.h in text file...
What did I missed??
<pre>
#ifndef MODULES_M_BT_H_
#define MODULES_M_BT_H_
#include <iostream>
#include <stdint.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>
#include <bluetooth/hci_lib.h>
C++ function
<pre>int C_BT::Scan(void) {
cout << "C_BT::Scan(void) " << endl;
int device_id = hci_get_route(NULL); if (device_id < 0) {
printf("Error: Bluetooth device not found");
exit(1);
}
return 0;
}
Error
./src/MODULES/M_BLUETOOTH/CBT.o: In function `std::C_BT::Scan()':
/media/jim/DEV/eclipse-workspace/VNAR_1204/Debug/../src/MODULES/M_BLUETOOTH/CBT.cpp:42: undefined reference to `hci_get_route'
collect2: error: ld returned 1 exit status
makefile:75: recipe for target 'VNAR_1204' failed
make: *** [VNAR_1204] Error 1
Can I get a second opinion ?
Cheers
Vaclav
|
|
|
|
|
At a guess it's a C file and you are dragging it into a C++ file and getting splattered by name mangling
Name mangling - Wikipedia[^]
The two solutions are in the above link under Handling of C symbols when linking from C++
Check are the bluetooth library files C or C++
If C the easiest is probably include all the C header files like so
extern "C" {
#include <bluetooth/hci_lib.h>
}
In vino veritas
|
|
|
|
|
Leon,
you are close, it is C file , but...
It has ( or SHOULD HAVE (?) ) __cplusplus defined and
that should make it work in C++
So where do I check if __cplusplus id actually defined ?
#ifndef __HCI_LIB_H
#define __HCI_LIB_H
#ifdef __cplusplus
extern "C" {
#endif
I'll take a look what else can be "fixed" to make it go.
|
|
|
|
|
Did you forget to include a .lib file in your build?
|
|
|
|
|
You're not actually linking in the bluetooth library.
|
|
|
|