|
There are all sorts of possible reasons for this. What you should do is put some message boxes into the function in question, so by a process of elimination you can figure out where the program is crashing. I have lots of _bstr_t variables, and lots of CComBSTR, and I'm pretty crash free right now, but I've had to use the old message box trick a few times to figure out what line was failing so I could debug it.
Christian
Secrets of a happy marriage #27:
Never go to bed if you are mad at each other. It's more fun to stay up and fight.
|
|
|
|
|
I've developed a VC addin which works fine and now i want to provide some more feedback to the user and get rid of boring message boxes. This output should go either
a) into a new pane in the VC output window
or
b) into a existing pane in the VC output window (Results)
Using vcspawn is out of question. Using the OpenVC approch is to "illegal" for my taste.
Any clues how to send output to VC's output window? Or, maybe even better: how to add another docking bar with my own output window?
cheers
Andreas
|
|
|
|
|
Check out the source that comes with WndTabs - basically you need to hook into the VC window manually, not using the (limited) addin stuff provided.
Christian
Secrets of a happy marriage #27:
Never go to bed if you are mad at each other. It's more fun to stay up and fight.
|
|
|
|
|
If you are referring to "creating a docking toolbar into VC", yes, hooking will be the way.
If you mean the "how to output into the VC output window", no.
>PrintToOutputWindow() in the IApplication object.
>It will output whatever you pass as parameter (text) into a pane called "Macro".
cheers
|
|
|
|
|
Yes, I was referring to creating a new pane.
Christian
As I learn the innermost secrets of the around me, they reward me in many ways to keep quiet.
Men with pierced ears are better prepared for marriage. They've experienced pain and bought Jewellery.
|
|
|
|
|
I was interested in doing this for my ResOrg add-in, but came to the conclusion it would be risky and time consuming, so I never got around to it.
What you want to do will almost certainly involve subclassing the main DevStudio window. You might be able to do it by hooking the WM_CREATE message of the mainframe and adding a child window to the control bar.
I suspect though that if the VC code isn't aware of the pane it won't work correctly - the only way to find out is to try it.
Adding a docking window of your own is non-trivial but possible - remember you'll need to provide a menu command or toolbar button to show/hide it, which means handling WM_COMMAND and WM_INITMENUPOPUP messages from the mainframe (and probably others too). You'll also need a suitable framework (such as BCGControlBar) to provide the docking window classes, unless you intend to write them yourself (which I wouldn't recommend).
Note that that there can be problems if several Add-Ins attempt to subclass the same window. This is a known issue with VC which has no resolution yet I'm afraid.
All in all, I think you'll find that you have to use the OpenVC "tricks" in order to get it too work. If I can assist in any way, please feel free to ask.
Good Luck!
Andy Metcalfe - Sonardyne International Ltd (andy.metcalfe@lineone.net) http://www.resorg.co.uk
"Lots of people want to ride with you in the limo, but what you want is someone who will take the bus with you when the limo breaks down."
|
|
|
|
|
Thanks a lot for this detailed explanation.
In the meantime i found a more or less convenient solution: PrintToOutputWindow() in the IApplication object.
It will output whatever you pass as parameter into a pane called "Macro". Suppose we cant choose another name for this pane.
Maybe this will be sufficient for your excellent ResOrg?
Cheers
Andreas
|
|
|
|
|
Anyone have a code snippet on how to do this, as I've must be doing something wrong, as I cannot get it to work.
Giles
|
|
|
|
|
See http://www.codeproject.com/database/usingblob.asp
Maybe it can help you.
|
|
|
|
|
I have read that article, fining it useful, but I am trying to implement that type of thing into the CODCBReocrdset class http://www.codeproject.com/database/odbcrecordset.asp
This dynamic class does not support writing binary types to the DB, but can read them. I've tried to adapt the code from the Using Blob article. It works fine for string less than ~50 characters but get I get a 'string truncated' error for anything larger. I'm using a memo field in Access, but its the same error with varBinary types as apposed to varChar.
Thanks
Giles
|
|
|
|
|
MSDN says "...In general, it is better practice now to use CByteArray in conjunction with the DFX_Binary function..."
That said, you should do something like this, I think:
CString s = "12345";
CByteArray b;
b.SetSize( s.GetLength()*sizeof(TCHAR) );
memcpy( b.GetData(), (LPCTSTR)s, b.GetLength() );
--
See me: www.magerquark.de
Want a job? www.zeta-software.de/jobs
|
|
|
|
|
I don't think I can use this as it has to work with CDBVariant. As far as I can tell CDBVariant will only take CLongBinary.
I may be mistaken though and making life hard for myself.
Thanks,
Giles
|
|
|
|
|
Well, then you must fill CLongBinary::m_hData and CLongBinary::m_dwDataLength by yourself.
I would just use the function ::GlobalAlloc() , ::GlobalFree() , etc.
--
See me: www.magerquark.de
Want a job? www.zeta-software.de/jobs
|
|
|
|
|
when I stop waverecord
//
if(hWaveIn){
waveInStop(hWaveIn);
waveInReset(hWaveIn);//failed
waveInClose(hWaveIn);
hWaveIn = NULL;
}
why ?????
these codes show open wave:
hWaveIn = NULL;
if(sta=waveInOpen(&hWaveIn, WAVE_MAPPER, (LPWAVEFORMATEX)&(pgsmwavefmt->wfx), (unsigned long)waveInProc, 1L, CALLBACK_FUNCTION))
{
return 2;
}
for(i=0;i < MAXWAVEBLOCK; i++)
{ WaveHdrIn[i].lpData=WaveInBuffer[i];
WaveHdrIn[i].dwBufferLength=MAXWAVEBUFFER;
WaveHdrIn[i].dwFlags=0;
WaveHdrIn[i].dwUser=0;
if(waveInPrepareHeader(hWaveIn, &WaveHdrIn[i], sizeof(WAVEHDR)))
{ return 3;
};
if(waveInAddBuffer(hWaveIn,&WaveHdrIn[i],sizeof(WAVEHDR)))
{
return 4;
}
}
if(waveInStart(hWaveIn))
{
return 5;
}
|
|
|
|
|
In my application i use ADO method in differents method. So, in each of them when i need of smart pointer as _RecordsetPtr or _ConnectionPtr, i declare them as local variable in each of them. So, i would like to know how and where i could declare the variable so that they would declare one time only. I try to declare them in the .h file or at the top of the .cpp file and it doesn't work, so what is the correct way of doing that?
thanks in advance
gerald
|
|
|
|
|
If you declare them in your header file, you'll need to call an initialise method in order to create them. Just declare your pointer, and either set it to NULL or call CreateInstance in the constructor, or in another method if you prefer. There is no reason for this not to work, I am doing the exact same thing as we speak.
Christian
Secrets of a happy marriage #27:
Never go to bed if you are mad at each other. It's more fun to stay up and fight.
|
|
|
|
|
Could you show me an example, because i'm a beginner in this kind of application
thanks
gerald
|
|
|
|
|
Sure, I'm happy to try. One caveat - this is my first ADO app and my first serious ATL app ( not that I think you're using ATL, nor do you need to, the point is I'm not talking from years of experience when it comes to ADO )
In my header I do this:
private:
_ConnectionPtr m_Connection;
In my constructor I do this:
m_Connection = NULL;
Then I have a Connect method like this:
STDMETHODIMP CSAFileDB::Connect(BSTR DatabasePath)
{
m_DatabasePath = DatabasePath;
m_Connection.CreateInstance(__uuidof(Connection));
CComBSTR conStr = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=";
conStr.Append(DatabasePath);
bstr_t con(conStr);
TESTHR(m_Connection->Open(con, "", "", adConnectUnspecified));
return S_OK;
}
Ignore the ATL stuff, the point is just that I connect.
Then in other methods I start by checking if m_Connection == NULL. My reason is that if it *is* NULL I can connect with each call, which slows things down but makes my database stateless ( each call performs a complete action and relies on no other calls, a good thing for a COM object to be able to do, I'm thinking ).
This works fine, so I see no reason why it wouldn't do the same for you, assuming all your methods are in the one class.
Christian
Secrets of a happy marriage #27:
Never go to bed if you are mad at each other. It's more fun to stay up and fight.
|
|
|
|
|
For global variables you need two kinds of declaration. You need to actually define them in exactly one .cpp file. This creates the space they occupy and initialises them.
The other declaration gives code outside of the module in which they are defined access to them.
So in the .h file you should put, say,
<br />
extern MyType *myGlobalPointer;<br />
in _one_ of the .cpp files you put
<br />
MyType *myGlobalPointer = NULL;<br />
extern is actually ignored these days but I prefer to put it in anyway for clarity.
Global Variables are pretty unpopular these days. Usually the substitute is to use static members of classes. So, for example, if you are declaring a "singleton" class, that is a class of which you will create only one instance you might do
<br />
class MyConnection : public CConnection {<br />
...<br />
public:<br />
static MyConnection *theConnection;
<br />
..<br />
<br />
MyConnection( ... ) : CConnection (... ) {<br />
...<br />
theConnection = this;
}<br />
And in cpp
<br />
<br />
MyConnection *MyConnection::theConnection = NULL; <br />
<br />
...<br />
<br />
<br />
MyConnection::theConnection->disconnect();<br />
<br />
|
|
|
|
|
how to crypt a string that contain 16 string to 8 string
ex:
9876123456783456 To 93831920
|
|
|
|
|
Maybe the concept your are looking for is Binary Coded Decimal. With this, you could encode ascii digits in a string so that one byte holds two digits - but it would not directly translate to a readable string, unless you discarded information in the translation.
|
|
|
|
|
I am creating a SDI application. The document keeps track of a single instance of a grid class which I need to save the state of. I have derived the grid class from CObject and am using the Serialize member function of the document class. My problem is that it does not seem to save anything of the user-defined grid class. I tried just saving an int value as well to make sure that it was actually serializing properly and it was. I derived my class (Grid) from CObject and placed the line DECLARE_SERIAL( Grid ) in the public section, and finally placed IMPLEMENT_SERIAL(Grid,CObject,1) at the bottom of my document class but no joy. Any ideas as to what I'm doing wrong?
Thanks for any help in advance
Nick
|
|
|
|
|
Have you implemented the virtual function 'Serialize' in your grid class?
To make your grid class reusable, put IMPLEMENT_SERIAL(Grid,CObject,1) in your grid.cpp istead.
In your doc class' Serialize call: m_mygrid.Serialize(ar);
In your grid class Serialize you need to store and load all grid information.
/Niklas
|
|
|
|
|
Hi!
I search the formula to compute the yHeight value of CHARFORMAT2 structure. I give a number to the formula like 10, 12 (like word font size selection). The following formula doesn't work :
-MulDiv ((int)dwSize, ::GetDeviceCaps (pDC->m_hDC,LOGPIXELSY), 72)
Thanks
F.Julien
|
|
|
|
|
How can I create an MDI application in MFC ??
A) NOT Doc/View
B) Dialog Based
there is a way in the MFC app wizard, at the end before 'Finish'
Change from 'CView' to 'CFormView'.
Then it's a dialog BUT Doc/View.
Is there any easy other way ??
Name: STR
BTW: for some of you that wished for CodeProject irc server
I create a channle on DalNet called "#CodeProject"
|
|
|
|