|
If I understand your problem correctly, I think you are expecting CBFinalFace to inherit the functionality implemented in IBFace by the CBFace class. This is not possible in COM, you can only inherit the actual interface. You will have to implement functions in CBFinalFace for your IBFace2 interface and your IBFace interface.
Incidentally, you'd have been better off posting this in the COM forum.
"Oh, I'm sick of doing Japanese stuff! In jail we had to be in this dumb kabuki play about the 47 Ronin, and I wanted to be Oshi, but they made me Ori!"
|
|
|
|
|
Actually, I'm not using COM at all. Sorry if the word interface mislead you. Yes, I know that in COM you cannot have implementation inheritance. But what I was doing was in straight, raw C++... no M$ or middleware involved.
so, interface can be read as struct
i.e:
struct I1 { virtual void fn() = 0; };
struct I2 : public I1 {};
class C1 :public I1 { void fn(); };
class C2 : public C1, public I2 {};
hope this clarifies my query a bit more
|
|
|
|
|
I am not a C++ guru, but this is how I understand the problem.
You have a diamond pattern:
<br />
I1<br />
/ \<br />
I2 C1<br />
\ /<br />
C2<br />
<br />
I1::f=0<br />
I2 f=? <br />
C1 f={}<br />
C2 ( f = I2::f or C1::f ? )<br />
which you should always try to avoid when you use multiple inheritance.
BTW: many people complain about multiple inheritance, but as long as you avoid a diamond patter, you'll be fine.
So C2 is asking which f() should I make visible ?
Your answer is: the one implemented. But this you know it only at linkage time.
You need to implement f also in I2 and still you'll get an error
because you still didn't answer the question ( f = I2::f or C1::f ? )
So you need to implement
C2::f() { return C1::f(); }
or you need to delete the declaration of f() in I1
Hope it clarifies.
|
|
|
|
|
Hello,
Is your declaration like this?
=========================================
class CBFace: public IBFace{...}
class IBFace2: public IBFace{...}
class CBFinalFace: public CBFace, public IBFace2{...}
=========================================
in case it is, try using virtual inheritance.
=========================================
class CBFace: virtual IBFace{...}
class IBFace2: virtual IBFace{...}
class CBFinalFace: virtual CBFace, virtual IBFace2{...}
=========================================
I hope it helps.
|
|
|
|
|
hi,
how can I convert a _variant_t object into a bitmap object?
the main problem is;
myRecordset->Fields->GetItem("mydata_picture")->Value;
here a _variant_t object returns.
I can change it into a _bstr_t object if the return value is;
myRecordset->Fields->GetItem("mydata_names")->Value;
picture variable type is IMAGE. names variable type is VARCHAR.
When I try to make this conversion into a bitmap object what must I do? First expression causes compiler error!
|
|
|
|
|
I do not know how to display a picture or a dialog box before the starting up of a program. Let's take PhotoShop for example. While loading it displays a picture with the authors of the program. I am writing in C++. Thank you.
modified 9-Mar-17 17:25pm.
|
|
|
|
|
|
Hi
i displayed the text in the grid control, if the string start with an alphabet it is left alligned and if it starts with number it is right aligned.. i want to align all the string either left or right
plzz help
|
|
|
|
|
nainakhawaja wrote:
i displayed the text in the grid control...
Which one?
"When I was born I was so surprised that I didn't talk for a year and a half." - Gracie Allen
|
|
|
|
|
i m so stupid i havent saw the properties properly yeah its ms flex grid control and yeah the problem is solved using SetCellAlignment(1); method.
|
|
|
|
|
Can anyone help me to solve my problem?
I try to improve the performance of SOAP by encoding the xml file become an binary file then compressing this binary file to a zip file at SOAP Server. After that, SOAP Server will send the zip file to SOAP Client. At SOAP Client, after receive the zip file, SOAP Client will be decompressed and de-encoded the zip file become a xml file. This process will help me to save bandwidth (too small). But my problem is that I don't know SOAP Client and SOAP Server recognize that zip file or not [in marshalling (at SOAP Server) and unmarshalling (at SOAP Client)process]?
Can anyone help me?
If possible, please send me an example source code and tell me where I can reference to solve this problem (it mean that documents).
Thanks a lot and best regards,
Lam Nguyen Duong
Lam Nguyen Duong
|
|
|
|
|
Hi! I have a problem checking and unchecking a menu item. The menu itself, is a context menu, activated when the system tray icon is right-clicked. When the user clicks a certain menu item, I want to check/uncheck it and take some action accordingly. I handle the click on the menu item like this:
void CZdnDlg::OnContextmenuStartup()
{
CMenu mmenu;
mmenu.LoadMenu(IDR_CONTEXT_MENU);
CMenu* submenu = mmenu.GetSubMenu(0);
UINT state = submenu->GetMenuState(ID_CONTEXTMENU_STARTUP, MF_BYCOMMAND);
ASSERT(state != 0xFFFFFFFF);
if (state & MF_CHECKED)
{
submenu->CheckMenuItem(ID_CONTEXTMENU_STARTUP, MF_UNCHECKED);
//some action 1...
}
else
{
submenu->CheckMenuItem(ID_CONTEXTMENU_STARTUP, MF_CHECKED);
//some action 2...
}
}
If initially the menu item is checked, then it takes "some action 1...", but it does not uncheck it. If initially the menu item is unchecked, it takes the "some action 2..." and it remains checked.
Why does this happen? Please help me!
danibanez
|
|
|
|
|
Try: submenu->CheckMenuItem(ID_CONTEXTMENU_STARTUP, /*MF_UNCHECKED*/ MF_CHECKED | MF_BYCOMMAND );
"though nothing
will keep us together
we can beat them
for ever and ever"
rechi
|
|
|
|
|
OnContextmenuStartup() is loading up a new copy of the menu resource and changing it, then that copy gets destroyed with the CMenu object goes out of scope. You need to load the menu once and keep a handle to it so OnContextmenuStartup() can read/write to the same menu that you show with TrackPopupMenu() .
--Mike--
Personal stuff:: Ericahist | Homepage
Shareware stuff:: 1ClickPicGrabber | RightClick-Encrypt
CP stuff:: CP SearchBar v2.0.2 | C++ Forum FAQ
----
There is a saying in statistics that a million monkeys pounding on typewriters would eventually create a work of Shakespeare. Thanks to the Internet, we now know that this is not true.
|
|
|
|
|
Thank you, Mike!
I didn't realise that. I'm still new with Visual C++ and MFC (about 2 weeks) and it takes some time to get used to them.
I took another aproach to the problem, but I'm sure that what you told me would work. I'm gonna give it a try!
danibanez
|
|
|
|
|
Hello
I need your help in DLL side loading processes. I made a DLL (MFC shared DLL) with dynamic link option. I made the settings correctly as I suppose. I am sending the code alongwith this as an attachment. But when I call the symbol "initialize" (in the DLL) in an application it is showing "undefined symbol" error. Could you please help me find out a solution for this? I am also sending the code where the symbol from the DLL should be called.
Regards,
Sreekanth Muralidharan.
|
|
|
|
|
|
I want to send a file on e.g. C:\Temp\myFile.txt
To my webserver at for e.g. www.cundes.se/filefolder/
Any tip on how to do it in an easy way?
Thanks
_____________________________
...and justice for all
APe
|
|
|
|
|
use FTP? The WinInet library (wininet.lib) has a comprehensive set of functions to do just that (see MSDN). You will have to run a FTP server on your server box though - you can either use IIS or a dedicated application such as Bulletproof FTP.
|
|
|
|
|
Well,
You would have to learn WEBDAV, assuming that this html extension is installed on your server and useable by the web server.
Otherwise, you'll have to do it using FTP or get a listener on the webserver.
If its not your own server (i.e.: like a free web server on the net) then you might need to be imaginative. For example, if they have a web interface to update pages, then you make a web page browser/form filler/etc .. so that it does the work for you. But its a time consuming process.
|
|
|
|
|
Hi Folks,
i like to programm a dock bar like objectdoch or mobydock for myself but i have no idea how to start. I mean i dont have a clue how to do this translucent window stuff (window that has no frame and no background and then drawing icons on that. hope you get what i mean ).
If someone knows how to get startet i would be REALY thankfull Or is there an opensource project somewhere out there?
Thanks for listening
Greetings puresilence2002
|
|
|
|
|
Hi,
Im pretty new at the whole c++ thing and have attempted to modify an app that requires the controlling of services. The start, stop, pause, continue etc work fine but the thing is that the person who first wrote the app has enabled multiple services to be able to be controlled from the one string of arguments. Eg. start service name service name service name which will call on the start method to start the 3 specified services. I guess my question is how do i limit this to only allowing 1 service to be passed. The code is below for clarification. The first method is the parse command line method followed by the int main();
boolean ParseCommandLine(int argc, TCHAR* argv[], DWORD &dwAction, DWORD &dwTimeout, Services &services)
{
if (lstrcmpi( argv[1], TEXT("/?") ) == 0)
{
printf("\nSCM controls Windows services, formerly know as NT services.\n");
printf("\nSCM start/stop/pause/resume/keepalive/status 'Service Name' [/k] [Timeout in");
printf("\nseconds]\n");
printf("\n start Starts the desired service if service is in a stopped state.");
printf("\n stop Stops the desired service.");
printf("\n pause Pauses the desired service if the service is running.");
printf("\n resume Resumes the service to a running state from a paused state.");
printf("\n keepalive Keeps the service running regardless of the state it is in.");
printf("\n status Returns the current state of the service as an error level.");
printf("\n ServiceName The name of the service to be controlled. This name has to be");
printf(" the services' name and not the display name.");
printf("\n/k (optional) Passing the /k command performs a kill function on the");
printf("\n service if the desired state or function called is not ");
printf("\n reached within a specified time, determined by the timeout");
printf(" specified.");
printf("\nTimeout in seconds Time in which to perform the specified action. The timeout");
printf("\n<optional> range is specified between 1 - 3600 seconds. Any timeout");
printf("\n outside of this range will result in the command not being");
printf(" executed.\n\n");
}
else if (argc < 3)
{ printf("\nNot enough arguments.\nArgument sequence is:\n\nSCM start/stop/pause/resume/status 'service name' [/k] [timeout in seconds].\n\n");
return false;
}
else if (lstrcmpi( argv[1], TEXT("start") ) == 0 )
dwAction = SERVICE_START;
else if ( argc > 1 && lstrcmpi( argv[1], TEXT("stop") ) == 0 )
dwAction = SERVICE_CONTROL_STOP;
else if ( argc > 1 && lstrcmpi( argv[1], TEXT("pause") ) == 0 )
dwAction = SERVICE_CONTROL_PAUSE;
else if ( argc > 1 && lstrcmpi( argv[1], TEXT("resume") ) == 0 )
dwAction = SERVICE_CONTROL_CONTINUE;
else if ( argc > 1 && lstrcmpi( argv[1], TEXT("keepalive") ) == 0 )
{
dwAction = 80;
}
else if ( argc > 1 && lstrcmpi( argv[1], TEXT("status") ) == 0 )
{
dwAction = 99;
QuerySvc(hSCM, argv[2]);
}
else
{
printf("\nBad Command.\nArgument sequence is:\nSCM start/stop/pause/continue/keepalive/status 'service name' [/k] [timeout in seconds]\n");
return false;
}
for (int i = 2; i < argc; i++)
{
string sz = argv[i];
if (sz.length() <= 0) continue;
if (sz[0] == _T('/')) break;
services.push_back(sz);
}
if (i < argc)
{
string sz = argv[i];
if (sz == _T("/k"))
{
if (i+1 >= argc)
{
printf("\nNot enough arguments.\n Argument sequence is:\nSCM start/stop/pause/resume 'service name' [/k] [timeout in seconds].\n");
return false;
}
// Check that argument is only digits
for (int c = 0; c < _tcslen(argv[i+1]); c++)
{
if (!iswdigit(*argv[i+1]))
{
printf("\nTimeout specified is not a number\n");
printf("\nArgument sequence is:\nSCM start/stop/pause/resume/keepalive/status 'service name' [/k] [timeout in seconds].\n");
return false;
}
}
// Check that timeout is within specified range
dwTimeout = _ttol(argv[i+1]);
if (dwTimeout < 1 || dwTimeout > 3600)
{
printf("\nTimeout not within specified range of 1 - 3600.\n");
return false;
}
dwTimeout *= 1000;
}
else
{
printf("\nBad Command.\nSequence of command is:\nSCM start/stop/pause/resume/keepalive/status 'Service Name' [/k] [time in seconds between 1 - 3600]\n");
return false;
}
}
return true;
}
int _tmain( int argc, TCHAR* argv[] )
{
DWORD dwTimeout = -1;
DWORD dwAction;
Services services;
if (!ParseCommandLine(argc, argv, dwAction, dwTimeout, services))
{
return -1;
}
for (int i = 0; i < services.size(); i++)
{
if ( dwAction < 0)
{
ReportStatus(services[i].c_str());
}
else
{
switch (dwAction)
{
case SERVICE_START:
StartService(services[i].c_str(), dwTimeout);
break;
case SERVICE_CONTROL_STOP:
StopService(services[i].c_str(), dwTimeout);
break;
case SERVICE_CONTROL_PAUSE:
PauseService(services[i].c_str(), dwTimeout);
break;
case SERVICE_CONTROL_CONTINUE:
ContinueService(services[i].c_str(), dwTimeout);
break;
case 80:
KeepAlive(services[i].c_str());
break;
case 99:
//get service handle
hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
hService = OpenService(hSCM, services[i].c_str(), SERVICE_QUERY_STATUS);
if (hService == NULL)
{
PrintError(GetLastError());
return -2;
}
SERVICE_STATUS status;
//query status
if(!QueryServiceStatus(hService,&status))
{
::CloseServiceHandle(hSCM);
PrintError(GetLastError());
}
return status.dwCurrentState;
break;
}
}
}
return 0;
}
Any help would be greatly appreciated. Thanks
nicolai
"Yesterday it worked. Today it didnt. Windows is like that.
|
|
|
|
|
For a very quick fix try commenting out this line of code:
for (int i = 2; i < argc; i++)
{
string sz = argv[i];
if (sz.length() <= 0) continue;
if (sz[0] == _T('/')) break;
//comment out the line below
//services.push_back(sz);
}
you should still optimize some part though.
hope this helps for the meantime.
|
|
|
|
|
It does help but unfortunately commenting out that line will cause none of the command line functions to execute - it just terminates. So not good for the app if it cant actually control anything.
|
|
|
|
|
Its due when wrote:
...how do i limit this to only allowing 1 service to be passed.
Look at the argc variable passed to ParseCommandLine() .
"When I was born I was so surprised that I didn't talk for a year and a half." - Gracie Allen
|
|
|
|