|
Have you tried to compile your test program with the modified .cpp before you move on to compile it with static library?
It could be something missing in your header files.
just a suggestion.
Also, by looking at the linker error, you could tell which function prototype is missing.
Sonork 100.41263:Anthony_Yio
|
|
|
|
|
If all of your classes are templates, then there's not much you can do, I'm afraid. You can try to refactor the parts of the classes that aren't dependent on the template type into a base class, but the template class will still need to be in the header.
- Mike
|
|
|
|
|
If you don't have any instances of the template class' then there is no issue.
If you have something like :
Template.h :
template<class TT> class TCkPool
{
...
};
and want specific instances of TCkPool exported e.g. a TCkPool<long>, TCkPool<double>, then do :
TemplateExp.h :
#include "Template.h"
typedef TCkPool<long> CkLongPool;
typedef TCkPool<double> CkDoublePool;
TemplateExp.cpp :
template class CMKUTL_API TCkPool<long>;
template class CMKUTL_API TCkPool<double>;
The code in TemplateExp.cpp causes the compiler to create full instances of TCkPool<long> and TCkPool<double>.
If you are creating a dll then :
#define CMKUTL_API __declspec(dllexport)
else for a static lib :
#define CMKUTL_API
...cmk
Save the whales - collect the whole set
|
|
|
|
|
Hi all,
I have a visual C++ application running on a wi-fi equipped PC. This application opens a receiving socket in order to receive data from a wi-fi pocket pc. I need to make sure that the PC is completely protected from an intruder. I am thinking about installing a firewall to block ALL incoming traffic from ANY port other than the one that I use for the socket connection. Will this completely secure my PC from an intrusion?
Best Regards,
Chris
|
|
|
|
|
Hi,
Time for some MC. Grades will not be given, no answer is wrong. So don't hesitate to answer.
in my many wanderings across the Expanse I have found two ways to create multiple-splitted views.
One is to define various CSplitterWnd (or a derived class) variables in your MainFrm class, and initialise all of them in its OnCreateClient function. \
The other is to define but one CSplitterWnd variable in your MainFrm, and then create CWnd/CFrameWnd derived views in its OnCreateClient function. These derived views have their own CSplitterWnd variable, which is initialised in their OnCreate(Client) function. This process can of course be repeated several times.
Now, the big Q is, which of the two has the preference? Is it easier to update all the views in one case, or update only specific views? Is it easier to get a specific pane? Etc, Etc.
Much regard,
Erik
|
|
|
|
|
That is depends on how you would like your CView object to behave towards it's CDocument object.
As you know, a MDI or SDI architecture is that a CView is to be attach with a CDocument object or a CDocument to be attached with multiple CViews. So, assuming that your have few splitterwnd in your view and the splitterwnd informations could reflect your CDocument content, then second design would be preferable.
just a comment.
Sonork 100.41263:Anthony_Yio
|
|
|
|
|
Hello
I need to change the backcolor of checkboxes and radiobuttons. I tried creating them with the transparent style on but it didn´t work. As far as my knowledge goes the only idea that´s left is making them owner-draw and handle all the drawing logic...Is this the only way? I am missing something?
Thanks
Gabriel
Old C programmers never die. They just cast into void
|
|
|
|
|
You don't need to make them owner-drawn, it can be done leaving them as is. However, you are handling the drawing logic to some extent. There is a function that is generic to all controls called OnCtlColor. This is what handles the color for every control created. You need to override this in order to change the color. This is all done in the control's Parent class.
Here's an example:
HBRUSH CChat::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
if(m_EditMessageView.m_hWnd == pWnd->m_hWnd)
{
pDC->SetBkColor(RGB(255,255,255));
pDC->SetTextColor(RGB(0,0,0));
return m_brWhiteBrush;
}
else
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
return hbr;
}
}
The part in the else statement is what is already there by default. The part in the if statement was added to change the color.
What's going on in the code is we check the control's handle that we want to change and see if it matches the control that currently has focus. If we are in the correct control, then we apply the changes. The brush that is returned was intialized in the constructor as follows:
m_brWhiteBrush.CreateSolidBrush(RGB(255,255,255));
Returning the brush changes the control's background color. Don't think this really has an effect on checkboxes and radio buttons though.
Mike
P.S. This all comes from a book I have, Microsoft's MFC book by Jeff Prosise. Good book to have
|
|
|
|
|
Mike Danberg wrote:
if(m_EditMessageView.m_hWnd == pWnd->m_hWnd)
Is m_hWnd public?
Rickard Andersson
Here is my card, contact me later!
UIN: 50302279
Sonork: 37318
|
|
|
|
|
Rickard Andersson18 wrote:
Is m_hWnd public?
Yes.
Snipped from afxwin.h (ce version, but I guess the desktop version is similar):
class CWnd : public CCmdTarget
{
...
public:
HWND m_hWnd;
“Our solar system is Jupiter and a bunch of junk” - Charley Lineweaver 2002
|
|
|
|
|
But why? I've learned from many here on CP (long time ago) that member varibles should always be private.
Rickard Andersson
Here is my card, contact me later!
UIN: 50302279
Sonork: 37318
|
|
|
|
|
Ah, but you forget one thing... this is MFC
Most of the classes have public members, like CGdiObject or that CRect inherits publicly from the struct tagRECT .
My guess is that the designers of MFC didnt care much about strict adherance to OO principles, be it for compatability/speed/lazyness/clarity of the api/etc.
“Our solar system is Jupiter and a bunch of junk” - Charley Lineweaver 2002
|
|
|
|
|
Thanks Mike for your help.
I wasn´t using MFC so i hadn´t a general message handler like OnCtlColor but handlers to specific messages. There not exists anymore the WM_CTLCOLOR message in win32 but there exists messages specific to controls. For example, WM_CTLCOLOREDIT, WM_CTLCOLORBTN etc...I suppose MFC keeps the handler for backwards compatibility.
Well, the problem was that you can only receive WM_CTLCOLORBTN if you create the button as owner draw but then you also need to handle all the drawing logic! What´s the point with this message??? And if you want to change the background color to checkboxes and radio buttons you need to process WM_CTLCOLORSTATIC!!! WTF....
Gabriel
Old C programmers never die. They just cast into void
|
|
|
|
|
No problem. Wish I could help you more, but unfortunately I really only know MFC when it comes to stuff like this. Probably should try to learn to do it using Win32 api, eventually I'll probably end up having to.
Yeah, that seems kind of pointless to have the messages if you can only use them if the control is owner drawn.
Mike
|
|
|
|
|
Hi,
I want to do that cartoon character moving on the client window freely as well as speaking(speech). Speech is predefined.
Thanks
|
|
|
|
|
i use CRegKey in InitInstance() to write a string in
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersio
n\Run
I start run the application.
then i power off my pc when the application keeps running.
after the window restart
i found out that the key in "run" i wrote is disappear.
thats the application cannot be auto run
how can i solve it?
thx
|
|
|
|
|
One solution is to design the application as a service.
Check out the code section for examples.
Kuphryn
|
|
|
|
|
|
Normally, when you write to the registry Windows doesn't make those changes right away, but it stores them in a buffer. There is a flush function somewhere that makes Windows write those changes right away. Look for it either in CRegKey class definition or look at Windows API for the registry functions. Probably, when you restart your computer the buffer has not been flushed.
// Afterall, I realized that even my comment lines have bugs
When one cannot invent, one must at least improve (in bed).-My latest fortune cookie
|
|
|
|
|
i have tried all the flush
CArchieve
CFile
fstream
reg
also cant prevent the data lost......
|
|
|
|
|
I don't know then. Sorry I can't help.
// Afterall, I realized that even my comment lines have bugs
When one cannot invent, one must at least improve (in bed).-My latest fortune cookie
|
|
|
|
|
Hi,
I am working on a winsock applications that utilize IOCP and AcceptEx() winsock extension. Basically, the program is a client/server and can send and receive data. Here is the program.
- server activates IOCP and AcceptEx() listening on port 1000
- client activates IOCP and AcceptEx() listening on port 1000
...
- server sends a package to client (server -> data -> client)
...
- server processes incoming socket from AcceptEx().
At this point, the incoming data is valid. Everything looks good and valid. I tested this via sending of ASCII test. Everything looks valid.
- client process the data and sends data back to server (client -> data -> server).
For some reason, the server never receives the data. IOCP acknowledged the WSASend() post. It even returns the size of the packet. However, the server never receives the packet.
At this point, I have no idea what is causing the problem. At any given time, both client and server can make NEW connections and send data with the initial packet. However, once the other side receives the incoming connection, processes data, and sends back a response, the response DOES NOT arrive.
Please post if you have any idea as to what is causing this problem. I am not too familiar with AcceptEx() in terms of any specific API that must be called once a socket has been accepted. I did implement setsockopt().
Thanks,
Kuphryn
|
|
|
|
|
kuphryn wrote:
- server sends a package to client (server -> data -> client)
...
- server processes incoming socket from AcceptEx().
? Missing connect step(s), who do you have connecting to whom (seeing as you have both 'client' and server listending) ?
Generally you don't have the 'client' accepting, it initiates the connection to the server and the server then uses that new connection to talk to the client.
kuphryn wrote:
I did implement setsockopt()
To do (SO_UPDATE_ACCEPT_CONTEXT) ?
Sorry, but there are too many unknowns to provide much help at this point. I use IOCP and AcceptEx in my server code and IOCP in my client code and i haven't had any problems like this.
...cmk
Save the whales - collect the whole set
|
|
|
|
|
Yeah.
The problem is so weird. Yes, the server does make a connection to the client and the other way around. That is how AcceptEx() returns a valid socket.
I just cannot figure out why once IOCP dispatches a new incoming socket, that socket cannot be used to send or receive data. It is almost like there is a step or two missing. In other words, there is an API call that needs to be made to an incoming AcceptEx() socket. Yes, I implemented SO_UPDATE_ACCEPT_CONTEXT. The problem remains.
Kuphryn
|
|
|
|
|
I am using a common edit control for the purpose of displaying output in text format in my application. Every time I need to write something to the screen I find that I need to put the contents of the edit box into a string put the new output into anothor string, concatenate these two strings togethor and then output this new longer string to the screen. For simplicities sake isn't there a way to just call a function similar to idcoutput->SetWindowText(); that will add text and not overwrite the box with the new text?
Thank you,
Eric Sepich
|
|
|
|