|
boost::bind returns a function object, not a C function. It may behave like a function pointer, but these types are different, and the compiler won't be able to match the function argument list with a function object as the second argument.
The problem you describe cannot be solved with the limitations you've set. Clearly, part of the limitations are of your own making and need to be revised. To understand that, you just need to think about the flow of control:
1. from your code you set up a callback mechanism that is supposed to call your callback function
2. then you call a function outside of your code
3. At some point this outside function calls your callback function, passing along some data
4. Your callback function is called. the only data it has are the function arguments it got passed from it's calling function. At this point it is entirely out of context from the rest of your application and doesn't know about any of your B objects that you may have created. If the calling function doesn't know about Bs, then the callback function cannot know about them either.
It is impossible to process anything dependend on some B member variables in the callback function, unless you pass these variables all the way from step 1 through step 4! Unfortunately the code in step 3 is outside your control - therefore this is impossible. Or it wouldbe impossible if you insist on passing along a reference to some B object: the caller doesn't know about that class!
There are only two solutions that may work:
1. the library you are using lets you pass along additional data to the callback setup which then will be passed to the callback invocation. If so, you could just pass along the values of var1 and var2.
2. If the above isn't possible, the only alternative I see is to use global variables to store the state of B or just its member variables.
Of course. the premise that your callback absolutely needs to know your B object may have been wrong! Time to think about how you intended to use this callback mechanism!
GOTOs are a bit like wire coat hangers: they tend to breed in the darkness, such that where there once were few, eventually there are many, and the program's architecture collapses beneath them. (Fran Poretto)
|
|
|
|
|
Hello, I am using Win32++ and I would like to know how to prevent a CDialog window from closing the main frame (CMainFrame). I have overriden OnOK() and OnClose() and added nothing to these functions.
R.S.V.P
|
|
|
|
|
Member 13721875 wrote: I am using Win32++ What is Win32++? Also, we cannot guess what your code is doing, you need to provide more information.
|
|
|
|
|
|
Thanks, I think I came across this many years ago, but cannot remember where. And I thought MFC was also free these days.
|
|
|
|
|
You have the code so look at what messages a CDialog sends and posts in response to it's WM_CLOSE and WM_DESTROY.
In vino veritas
|
|
|
|
|
I am trying to get the file size, with code:
::FindFirstFile((LPCTSTR)strFileSpec, &fd);
LARGE_INTEGER size;
size.HighPart = fd.nFileSizeHigh;
size.LowPart = fd.nFileSizeLow;
DWORD dwsize = (DWORD)size.QuadPart;
but is not right when the size of the file is huge, because at a file with 7.8 GB in windows explorer, my code says that has 3.03 GB ...
I have tried with this code too:
CFileStatus status;
CFile::GetStatus(strFileName, status);
DWORD dwsize = (DWORD)status.m_size);
the same result ... what I am doing wrong ?
My OS is Win10 64 bit.
modified 14-Mar-19 6:39am.
|
|
|
|
|
|
Yes, that was the problem. Thank you.
|
|
|
|
|
|
I am trying to get an image list handle from system icons, like that:
return (HIMAGELIST)SHGetFileInfo(_T("c:\\"), 0, &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
and is working good, except on some PCs, where there is some icons without any icon. I am using this handle to a CListCtrl:
Where icon has found: Capture — Postimage.org[^]
Where icon hasn't: Capture2 — Postimage.org[^]
Of course that OS has the icon and program for every type of files, including case where my code dont't work ...
Last edit: Here is what is looking the list control with this state of icons: Capture — Postimage.org[^]
So one of files has icons, one hasn't ... and I am not figure out why ...
modified 14-Mar-19 3:54am.
|
|
|
|
|
Try adding some debug code to see exactly what is being returned on your call to SHGetFileInfo .
|
|
|
|
|
I have solved, I have used the same image list handle for two controls, CTreeCtrl and CListCtrl ... and I haven't share this image list correctly ... now everything is alright.
|
|
|
|
|
Is there possible to write a registry key inside HKEY_LOCAL_MACHINE whith an app which is not running as admin ? I have tried that, I cannot write to HKEY_LOCAL_MACHINE with a MFC app where is run without administrator rights ...
modified 13-Mar-19 9:17am.
|
|
|
|
|
No - not unless an administrator has previously changed the permissions on the key in question to grant the non-admin user permission to write to it.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
|
In a template does inline hold the same meaning as when it's used in a class?
I.e. the way I understood it in a class it "requests" the compiler to put it inline but the compiler was not required to do so and it was up to the compiler to decide.
template <typename T>
inline T const& MyTemplateFunc (T const& a, T const& b)
{ return a < b ? b:a;
}
|
|
|
|
|
Quote: it "requests" the compiler to put it inline but the compiler was not required to do so and it was up to the compiler to decide. That and more than that. See the documentation (inline specifier - cppreference.com[^]) for the gory details.
|
|
|
|
|
Hello,
I wanted to find the roots for 4th degree polynomials(aX^4 + bX^3 + cX^2 + dX + e = 0). Can anyone please help me, How to write C code or formula for this?
Thanks in advance,
Regards,
Harsha
|
|
|
|
|
|
|
Could somebody please explain to me why I do not see the "perror" in expected code sequence?
Thanks
int main() {
cout << "Basic bluetooth app BLUEZ_LINUX " << endl; inquiry_info *ii = NULL;
int max_rsp, num_rsp;
int dev_id, sock, len, flags;
int i;
char addr[19] = { 0 };
char name[248] = { 0 };
dev_id = hci_get_route(NULL);
SHOULD PRINT PERROR HERE ??
if (dev_id < 0) {
perror("Error: Bluetooth device not found"); }
#ifdef DEBUG
cout << " dev_id = hci_get_route(NULL) " << endl; cout << " dev_id " << hex << +dev_id << endl; #endif
#ifdef BYPASS // replaced with abpve perror
dev_id = hci_get_route(NULL);
#endif
sock = hci_open_dev(dev_id);
#ifdef DEBUG
cout << " sock = hci_open_dev( dev_id ) " << endl; cout << " sock " << hex << +sock << endl; #endif
if (dev_id < 0 || sock < 0) {
perror("Error: Opening socket");
}
#ifdef DEBUG
cout << " HERE @line " << dec << __LINE__ << endl; cout << " TRACE file " << __FILE__ << endl;
cout << " function " << __FUNCTION__ << endl;
#endif
len = 8;
max_rsp = 255;
flags = IREQ_CACHE_FLUSH;
#ifdef DEBUG
cout << " HERE @line " << dec << __LINE__ << endl; cout << " TRACE file " << __FILE__ << endl;
cout << " function " << __FUNCTION__ << endl;
#endif
ii = (inquiry_info*) malloc(max_rsp * sizeof(inquiry_info));
#ifdef BYPASS
if (ii)
perror("Error: inquiry_info*");
if (ii)
perror("Error: inquiry_info*");
#endif
#ifdef DEBUG
cout << " HERE @line " << dec << __LINE__ << endl;
cout << " TRACE file " << __FILE__ << endl;
cout << " function " << __FUNCTION__ << endl;
#endif
#ifdef DEBUG
cout << " max_rsp " << hex << +max_rsp << endl;
cout << " num_rsp " << hex << +num_rsp << endl;
cout << " len " << hex << +len << endl;
cout << " flags " << hex << +flags << endl;
#endif
num_rsp = hci_inquiry(dev_id, len, max_rsp, NULL, &ii, flags);
if (num_rsp < 0)
perror("Error: hci_inquiry");
#ifdef BYPASS
if (num_rsp < 0)
perror(NULL);
#endif
#ifdef DEBUG
cout << " num_rsp = hci_inquiry(dev_id, len, max_rsp, NULL, &ii, flags); "
<< endl; cout << " num_rsp " << hex << +num_rsp << endl; #endif
if (num_rsp < 0)
perror("Error: hci_inquiry");
#ifdef DEBUG
cout << " HERE @line " << dec << __LINE__ << endl; cout << " TRACE file " << __FILE__ << endl;
cout << " function " << __FUNCTION__ << endl;
#endif
for (i = 0; i < num_rsp; i++) {
ba2str(&(ii + i)->bdaddr, addr);
memset(name, 0, sizeof(name));
if (hci_read_remote_name(sock, &(ii + i)->bdaddr, sizeof(name), name, 0)
< 0)
strcpy(name, "[unknown]");
printf("%s %s\n", addr, name);
}
#ifdef BYPASS
free( ii );
close( sock );
#endif
return 0;
}
Basic bluetooth app BLUEZ_LINUX
dev_id = hci_get_route(NULL)
dev_id ffffffff
sock = hci_open_dev( dev_id )
sock ffffffff
HERE @line 84
TRACE file ../src/BLUE.cpp
function main
HERE @line 94
TRACE file ../src/BLUE.cpp
function main
HERE @line 109
TRACE file ../src/BLUE.cpp
function main
max_rsp ff
num_rsp 0
len 8
flags 1
num_rsp = hci_inquiry(dev_id, len, max_rsp, NULL, &ii, flags);
num_rsp ffffffff
HERE @line 154
TRACE file ../src/BLUE.cpp
function main
Error: Bluetooth device not found: No such device
Error: Opening socket: No such device
Error: hci_inquiry: No such device
Error: hci_inquiry: No such device
|
|
|
|
|
It does print the message at the bottom as you can see in the above output. Most likely because the stderr stream is not displayed until the application terminates
|
|
|
|
|
Richard MacCutchan wrote: Most likely because the stderr stream is not displayed until the application terminates
I think that's because C++ IO streams and C stdio streams are no synchronized. Try using stdi::ios_base::sync_with_sdio . std::ios_base::sync_with_stdio - cppreference.com
|
|
|
|
|
Not according to my tests, and ultimately cout (under the covers) will be printing to stdio/stderr in normal fashion.
|
|
|
|