|
thx. Am I bound to use MFC... or can I also make my own classes (it's a network class here) a DLL?
|
|
|
|
|
Chris Losinger wrote:
you can only export a class from a DLL if you make an MFC (or "extension") DLL.
That is not true. Create a new Win32 DLL project in VC++ and select the option to export some symbols, a plain C++ class will be exported.
Build a man a fire, and he will be warm for a day Light a man on fire, and he will be warm for the rest of his life!
|
|
|
|
|
???
i've been wrong on this point for years.
is it that you can only export MFC object from an MFC DLL?
-c
Conservative:
One who admires radicals centuries after they're dead.
-- Leo C. Rosten
|
|
|
|
|
Chris Losinger wrote:
is it that you can only export MFC object from an MFC DLL?
Think that is correct, because you need to have the CWinApp object to work with. However, a MFC extension DLL is a special type of DLL that uses the MFC applications CWinApp object instead of creating its own.
Then there is a regular DLL that can export functions and C++ objects.
Build a man a fire, and he will be warm for a day Light a man on fire, and he will be warm for the rest of his life!
|
|
|
|
|
create a win32 DLL project in VC++, and select the option that "exports some symbols". That should get you started. Here is the syntax to export a class:
class __declspec(dllexport) CClass {
public:
CClass(void);
};
The problem with exporting C++ classes is when you decide to expand the class for version 2.0 of your software. If you have different versions of a DLL with different class specifications in each DLL, then your programs may not work properly unless they have the properly matching DLL versions. This is the problem that COM attempts to solve.
If you are creating a program that may have different versions, then you may want to consider using COM instead of exporting classes from a DLL. This is just a suggestion.
If you have any more questions feel free to ask.
Build a man a fire, and he will be warm for a day Light a man on fire, and he will be warm for the rest of his life!
|
|
|
|
|
kilowatt wrote:
If you are creating a program that may have different versions, then you may want to consider using COM instead of exporting classes from a DLL. This is just a suggestion.
If you have any more questions feel free to ask.
thanks, I think I'm ready to start.
Currently I do not plan to use different versions of a class.
Another thing I might implement is checking for "plugin" DLLs (all in same format, but with different functionality, normal C is fine here). For example a file provider1.dll, provider2.dll, etc... if they exist I would like to use them? Winamp uses this kind of DLL "plugins", but I don't know how it works.
|
|
|
|
|
Is there a way to programatically cancel/close a menu that was displayed using TrackPopupMenu?
I am displaying a menu using TrackPopupMenu. When that menu is rt-clicked, I handle the WM_MENURBUTTONUP message and create a new popup context menu by calling TrackPopupMenu with the TPM_RECURSE flag set. I would like all the menus to close when a selection is made from the context menu, but have not found a way to do so. Currently only the context menu is closed, not the original menu. Any ideas on how to force it to close as well?
Thanks,
Greg
|
|
|
|
|
I believe sending a WM_CANCELMODE to the parent window of the menus will do the trick.
--Mike--
Just released - RightClick-Encrypt v1.3 - Adds fast & easy file encryption to Explorer
My really out-of-date homepage
Sonork-100.19012 Acid_Helm
|
|
|
|
|
|
I have a blob that i retreived in a char* buffer, and it has access header stuff for 78 starting bytes. I want to remove these. whats the simplest way of doing this. I know the total length. i tried:
but it crashes at the memcpy. The pBuf I got from doing :
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
Its the first 78 bytes of pBuf I want to get rid of.
Thanks,
ns
|
|
|
|
|
memmove ( pBuf, pBuf+78, DataLength-78 ); You need to use memmove() because the source and dest ranges overlap.
--Mike--
Just released - RightClick-Encrypt v1.3 - Adds fast & easy file encryption to Explorer
My really out-of-date homepage
Sonork-100.19012 Acid_Helm
|
|
|
|
|
Gosh! That was like magic!! I couldnt believe it when I used your memmove and my images showed up!!!!I cant thank you enough!!!!!
ns
|
|
|
|
|
I don't think you even need to do that. If you have a char * called szRodney and you want to skip the first four characters, then
char * szEy = szRodney+4;
should do it, just don't forget to delte szRodney and NOT szEy.
Christian
We're just observing the seasonal migration from VB to VC. Most of these birds will be killed by predators or will die of hunger. Only the best will survive - Tomasz Sowinski 29-07-2002 ( on the number of newbie posters in the VC forum )
Cats, and most other animals apart from mad cows can write fully functional vb code. - Simon Walton - 6-Aug-2002
|
|
|
|
|
One way to do it is:
int bytestoskip = 78;<br />
void *pBuf;<br />
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);<br />
char *szStr = (char *)pBuf + bytestoskip;
Drinking In The Sun
Forgot Password?
|
|
|
|
|
Great! But a nagging question. I'm new to pointers. Now ,I thought that when you declare something as char* you have to do a new to allocate memory before you can use it. Yet in the SafeArrayAccessData and also your *szStr, all we have is the pointer declaration, but no memory allocated for its contents. Sorry if this is an obvious question.
Thanks for the nifty suggestion.
ns
|
|
|
|
|
A SafeArray has the data allocated somewhere in its internal buffer. When you call SafeArrayAccess Data, the interal buffer is locked and a pointer to it is returned to you. This means that you do not have to copy the data, but you'll have to keep the safearray locked. Remember to call SafeArrayUnaccessData when you're done with the pointer!
James
Drinking In The Sun
Forgot Password?
|
|
|
|
|
|
Ok, I work with VB professionally, however I am about to make the jump into working on a possible project using MFC (applaud later ). I know this may sound like a dumb question but if I wanted to have a button show what a dialog window to open a file I know in VB we use the CommonDialog component. What do you do for MFC? I was looking around and I can see that you can insert a resource but that wasn't very clear to me. Can someone point me in the right direction, thanks in advance?
Nick Parker
|
|
|
|
|
|
Michael Dunn wrote:
I think you're talking about the standard file open dialog? MFC has CFileDialog.
Thanks Mike,
That's exactly what I was looking for.
I tried to do
CFileDialog cf;
cf.ShowWindow();
but I get an error saying "'CFileDialog' : no appropriate default constructor available"
Nick Parker
|
|
|
|
|
RTFM
The CFileDialog constructor has one manadatory parameter, a BOOL indicating whether it's for opening (TRUE) or saving (FALSE). So something like:
CFileDialog dlg ( TRUE );
if ( IDOK == dlg.DoModal() )
{
CString sSelectedFile = dlg.GetPathName();
} You use DoModal() to show a modal dialog.
--Mike--
Just released - RightClick-Encrypt v1.3 - Adds fast & easy file encryption to Explorer
My really out-of-date homepage
Sonork-100.19012 Acid_Helm
|
|
|
|
|
Crap! You type faster than me!
|
|
|
|
|
Michael Dunn wrote:
RTFM
Which one do you suggest, really? I will give it a try.
Thanks Mike, hopefully I won't get stuck so quickly next time.
Nick Parker
|
|
|
|
|
Just put the cursor on the word CFileDialog, then hit F1 to jump right to the MSDN page on the class.
--Mike--
Just released - RightClick-Encrypt v1.3 - Adds fast & easy file encryption to Explorer
My really out-of-date homepage
Sonork-100.19012 Acid_Helm
|
|
|
|
|
WEll, you need to use the non-default constructor.
This is from MSDN.
CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );
so, CFileDialog cf(TRUE); will give you a default Open File dialog.
So you were on the right track.
MSDN is very helpful with this kind of information (either online or integrated into VisualStudio).
Hope this helps!
|
|
|
|