|
|
Hello,
I got the following question: I got a character array called oldblock which is going to be transfered via tcp socket to a linux machine. This works great so far. A file is read blockwise and transfered as well. So for performance purposes, before the block is sent to the socket I want it to be compressed via zip or any other useable compression algo and to be decompressed on the other side of the socket pipe. Hope you understand...Excuse my bad english, I'm from germany... A function looking like this would be great:
newblocksize = compress( char* oldblock, char* newblock, int oldblocksize);
where oldblock points to the uncompressed character array of size oldblocksize and newblock is a pointer to a character array of size newblocksize where the compressed data is stored. And on the other side a similar function turning around that process... decompressing instead of compressing, ya understand?!
Where can I find something like that for C++ platform independent?
ThanX for your answers and have a fine xmas!
|
|
|
|
|
|
I use the LZSS algorithm extensively
because it is dead simple to implement
(under a 100 lines of code easy)
and fast during decompression.
Here's a link[^].
There are plenty more via Google[^].
No patent issues [^]either.
Sigh... always check for the lawyer bait...
|
|
|
|
|
I've derived my own class from CListCtrl and am doing some processing when an item is selected i.e. via LVN_ITEMCHANGED. However, I want to distinguish between an item being selected via a mouse click and the keyboard.
So, I thought I would trap WM_LBUTTONDOWN/UP except that I never seem to get the WM_LBUTTONUP message. I can see the message being sent in Spy but I never seem to receive it. I can't even trap it in PreTranslateMessage(). Trying to capture the mouse with GetCapture() doesn't work either. But I get it if I double-click.
Anyone know what's going on?
he he he. I like it in the kitchen! - Marc Clifton (on taking the heat when being flamed)
Awasu v0.4a[^]: A free RSS reader with support for Code Project.
|
|
|
|
|
That silly list view sure can be a PITA sometimes. This happened to me a couple months ago, and I have really no idea why it won't let you get the WM_LBUTTONUP in the single-click case. The solution I found to check for the single-click is to handle the NM_CLICK notification message. I don't know how much this will help, but good luck.
Chris Richardson
Programmers find all sorts of ingenious ways to screw ourselves over. - Tim Smith
|
|
|
|
|
Thanks for that.
I thought about that but I would still need some way of knowing to then ignore the LVN_ITEMCHANGED.
Unless I ignore LVN_ITEMCHANGED all together but then I would have to process keyboard input myself to detect selection changes there. As you said, a serious PITA
he he he. I like it in the kitchen! - Marc Clifton (on taking the heat when being flamed)
Awasu v0.4a[^]: A free RSS reader with support for Code Project.
|
|
|
|
|
I wouldn't skip the LVN_ITEMCHANGED. Handling all the cases would be a real PITA. I was just checking the order that the messages are sent in, and I've discovered this order:
WM_LBUTTONDOWN
LVN_ITEMCHANGED
NM_CLICK
So, it appears that you could do something like this pseudo-code:
void CYourClass::OnLButtonDown( blah blah )
{
m_bLButtonDown = TRUE;
}
void CYourClass::OnItemChanged( blah blah )
{
if( m_bLButtonDown )
{
}
else
{
}
}
void CYourClass::OnClick( blah blah )
{
m_bLButtonDown = FALSE;
}
Chris Richardson
Programmers find all sorts of ingenious ways to screw ourselves over. - Tim Smith
|
|
|
|
|
Yeah. I'm loathe to do something like this though - who knows if it's going to work on every OS!
I was thinking of trying to install a global mouse hook and monitoring the button state there. Sigh...
Thanks for taking the time to have a look.
he he he. I like it in the kitchen! - Marc Clifton (on taking the heat when being flamed)
Awasu v0.4a[^]: A free RSS reader with support for Code Project.
|
|
|
|
|
Consider the following code:
typedef DWORD (FUNCPROC CommandProcPtr)(TCHAR*, TCHAR*, TCHAR*, LPVOID);
typedef std::pair<int, CommandProcPtr*> _vfpt;
typedef std::vector<_vfpt> _vtbl;
_vtbl vtbl;
vtbl.push_back(_vfpt(1,&Functions::_CommandProc1));
vtbl.push_back(_vfpt(2,&Functions::_CommandProc2));
vtbl.push_back(_vfpt(3,&Functions::_CommandProc3));
for (int i = 0; i < 3; i++)
{
char szArg[20];
sprintf(szArg, "Call number %i", i);
char szFlags[20];
sprintf(szFlags, "/exec /%i", i + 2);
char szCommand[20];
sprintf(szCommand, "Command%i", i * 3);
(*vtbl[i].second)(szCommand, szArg, szFlags, NULL);
}
Now, the bit where the function is invoked through the pointer:
(*vtbl[i].second)(szCommand, szArg, szFlags, NULL);
puzzles me (eh). Why does this:
(vtbl[i].second)(szCommand, szArg, szFlags, NULL);
work as well? (notice I'm not dereferencing std::pair.second there)
I'm sure there's some stoopid explanation and I'm just being dense, but I can't see why both versions would work? Or is there no difference between the two?
___________
Klaus
[vbbox.com]
|
|
|
|
|
There's no difference. I forget the exact legal details but a pointer to a function can be used without having to de-reference it.
he he he. I like it in the kitchen! - Marc Clifton (on taking the heat when being flamed)
Awasu v0.4a[^]: A free RSS reader with support for Code Project.
|
|
|
|
|
Klaus Probst wrote:
Why does this work as well?
Because it's a special case - you don't have to use * when calling a function through a pointer to the function.
Actually, using the * is probably the special case - a function pointer cannot be dereferenced, because a function is not an object. The language allows * to be used on calls thru function pointers in order to remain consistent with all other pointer usages, where * is required to dereference.
--Mike--
If it doesn't move and it should: WD-40. If it moves and it shouldn't: duct tape.
1ClickPicGrabber - Grab & organize pictures from your favorite web pages, with 1 click!
My really out-of-date homepage
Sonork-100.19012 Acid_Helm
|
|
|
|
|
Thanks Mike (and Taka!). I figured as much (since it obviously works), but I need to dredge my old C++ reference and take a look at this one a bit more closely.
Thanks again.
___________
Klaus
[vbbox.com]
|
|
|
|
|
IIRC, the reasoning goes something like this:
The name of a function is actually just a pointer to the first instruction of that function in memory somewhere. Kind of like when you declare an array of int's, the variable is actually a pointer to the first element.
So when you call a function foo(), you are just jumping to that particular place in memory. (*pFoo)() "dereferences" that "pointer" but since C++ doesn't really have a concept of a function object, it is taken to mean calling the function as well.
The "hack" in the language is really when you take the address of the function in the first place - we need the & operator to differentiate it from just a plain call to the function.
he he he. I like it in the kitchen! - Marc Clifton (on taking the heat when being flamed)
Awasu v0.4a[^]: A free RSS reader with support for Code Project.
|
|
|
|
|
My MDI App has two Document Types.
One we can call a workspace.
One we can call a doc.
Ive registered each document type with the application using the framework. I have also added the code that only allows "1" workspace to be opened at a time. I have also destroyed the "view" of the workspace, because I want the data to be displayed in a dockable tree ctrl, which i have also created, and is a member of MainFrame.
My Questions....
How do i get access to the workspace document (the current one) from my tree ctrl.
If I have both a workspace open and multiple "docs", how can I place a call to GetDocument and get only the "workspace" document?
excuse my silly questions, im not experienced with MFC or doc/view. Im moving along though. HELP ME KEEP MY MOMENTUM =)
Ryan Baillargeon
|
|
|
|
|
If there is only one workspace doc then you could do this
POSITION pos = ((CYourApp*)AfxGetApp())->m_pDocTemplate->GetFirstDocPosition();
CYourDoc *pDoc = (CYourDoc*) ((CYourApp*)AfxGetApp())->m_pDocTemplate->GetNextDoc(pos);
where m_pDocTemplate is your workspace template...make it public or add a public function to get a pointer to it
Gary Kirkham
A working Program is one that has only unobserved bugs
|
|
|
|
|
Hi all,
Can someone tell me how to get the messages from a child window opened with ShellExecute(...) and then respond to them. I tried setting the hwnd parameter to this->m_hWnd from a dialog app.. then i ran a spy++ and didn't see any messages going from the opened web browser back to my dialog app.
example.
From a Dialog app, i'm opening and html page in Internet Explorer and I need the Dialog app to be able to respond to dialog boxes that IE presents , like error messages and such. It sounds like i should be able to from the API docs...
-- MSDN ----------------------------
HINSTANCE ShellExecute(
HWND hwnd,
LPCTSTR lpOperation,
LPCTSTR lpFile,
LPCTSTR lpParameters,
LPCTSTR lpDirectory,
INT nShowCmd
);
hwnd
[in] Handle to a parent window. This window receives any message boxes that an application produces, such as error reporting.
...
---------------------------------
could someone let me know if my understanding of this is wrong.
Thanks for any help..
Rick
|
|
|
|
|
RickGavin wrote:
hwnd
[in] Handle to a parent window. This window receives any message boxes that an application produces, such as error reporting.
I dont think that'll work when you spawn a new app. This works only for shell commands like "open" and "print". I might be wrong though.
Nish
Author of the romantic comedy
Summer Love and Some more Cricket [New Win]
Review by Shog9
Click here for review[NW]
|
|
|
|
|
You are misunderstanding the purpose of the hwnd parameter. When you start a new process, it's off in its own process space, it is not a child of the launching process or its windows. hwnd is only used by the shell if an error occurs. hwnd is one of you windows, which is used as the parent of error dialogs if any are displayed.
--Mike--
If it doesn't move and it should: WD-40. If it moves and it shouldn't: duct tape.
1ClickPicGrabber - Grab & organize pictures from your favorite web pages, with 1 click!
My really out-of-date homepage
Sonork-100.19012 Acid_Helm
|
|
|
|
|
Thanks for setting me straight.
Since that obviously won't work, do you know a way to accomplish the task?
i.e. open a browser and then monitor it for any dialogs, and then pragmatically ok or cancel said dialog box, so that the user doesn't have to answer his/her self?
Thanks again
Rick
|
|
|
|
|
Hello,
When ever you save a document it changes the title to saved.doc or what ever the saved name is.. is there a way to prevent this from happening? I need the title of the application to stay the same even after saving.. Its probably an easy one..
Thanks,
Rob
|
|
|
|
|
Use SetTitle() and specify the caption name.
SetTitle is a member function of your document class.
|
|
|
|
|
Where would I put the code.. I have already tried this..
BOOL CMyDocumentDoc::OnSaveDocument(LPCTSTR lpszPathName)
{
SetTitle("My Document");
return CRichEditDoc::OnSaveDocument(lpszPathName);
}
And it doesnt work..
|
|
|
|
|
how about
BOOL CMyDocumentDoc::OnSaveDocument(LPCTSTR lpszPathName)
{
BOOL bRet = CRichEditDoc::OnSaveDocument(lpszPathName);
SetTitle("My Document");
return bRet;
}
I am not sure whether it works or not. I am just suspicious that OnSaveDocument will call SetTitle() automatically.
|
|
|
|
|
nope I think when this function returns the title gets changed..
Thanks though
Rob
|
|
|
|