|
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.
|
|
|
|
|
I was not trying to use any library - just source.
|
|
|
|
|
Perhaps this answer on SO is it: bluetooth - Linking with libbluetooth.so - Stack Overflow[^]
(In the past, I got bit by the gcc link order thing several times.)
Alternatively, you are missing some files. Search the source you have for hci_get_route. (The point is that the linker isn't seeing this symbol.)
|
|
|
|
|
Here is an indirect answer
"None of the function definitions are present in the header files: just the declarations. The definitions are in the library"
Make sense. Somewhat.
But "definitions are in library" ?
(Perhaps some A..no affectionado wrote the "library" )
What does not make sense - the example code I am using which was already been refereed too said zilch about need to use the library nor does it even mention the name of the library.
Perhaps it is obvious to experts that library has to be linked in.
But what the dickens is " compiled against (library)" ?
This nameless library (?) is probably different for each hardware too.
|
|
|
|