|
How about this?
struct Exception
{
char *text;
void *data;
}
enum ERROR{NONE,...};
void f()
{
char * buf = new char[128];
ERROR e = NONE;
...
if (...) e = ...
if (...) e = ...
if (...) e = ...
if(NONE != e)
{
Exception exp;
exp.text = FindTextForError(e);
exp.data = buf;
throw exp;
}
}
caller()
{
try
{
f()
}
catch(Exception exp)
{
delete exp.data;
}
}
|
|
|
|
|
what abt using smarpointers(ref counting) ?
If u can Dream... U can do it
|
|
|
|
|
Yes, it is fine.
But when I manapulate a dababase instead of memory,
for example, a prepared statement, I need to close it before leave.
Hope it can be common.
|
|
|
|
|
Just define your statement as a class,
that will perform all needed clearances and closing in its destructor.
Then - declare an instance (not an allocation by new) of the class object
in the throwing function -
the destructor will be called in any case (for all on-stack-instances)
They sought it with thimbles, they sought it with care;
They pursued it with forks and hope;
They threatened its life with a railway-share;
They charmed it with smiles and soap.
|
|
|
|
|
A class is ok in the case.
But in another case, the life scope of the object of the class
may larger than the try..catch... block, this can
bring problems, just because the scopes are not inconsistent.
However, there seems no proper way which is also efficient.
BTW, is there any language that can provide some thing like
constructor and distructor for a function?
|
|
|
|
|
All of the variables local defined in a function,
will be constructed on the stack at the beginning of the function
and then destructed - at the end of the function (even there was a throwing)
So you could provide a class for a function service, for example:
class CDBStatement;
class CDBStatementService
{
bool m_bOwner;
CDBStatement* m_pcStatement;
public:
CDBStatementService(CDBStatement* pcStatement, bool bOwner)
: m_pcStatement(pcStatement), m_bOwner(bOwner) {};
~CDBStatementService() {
if (m_pcStatement) {
m_pcStatement->Close();
if (m_bOwner) {
delete m_pcStatement;
}
}
}
};
void TestThrowing()
{
CDBStatementService cDBStatementService(new CDBStatement(), true);
}
They sought it with thimbles, they sought it with care;
They pursued it with forks and hope;
They threatened its life with a railway-share;
They charmed it with smiles and soap.
|
|
|
|
|
you said u need to close the database before u leave right ? so leave means , when the scope of that object goes away right ? so it must be possible to implement via const/dest . say for example when ur function first called the const of the object(declared inside the function) executes and when ur function terminates , the dest of the object executes. u can safely put things there right ?
If u can Dream... U can do it
|
|
|
|
|
If you don't want to use delete all over the place, don't manually manage memory. While it's a bit hard to see the context from the pared down code you've posted why not use an automatic array of char or use std::vector<char> ? Then you won't have to worry about clearing up dynamically allocated memory as you won't be using any.
Cheers,
Ash
|
|
|
|
|
But when I manapulate a dababase instead of memory,
for example, a prepared statement, I need to close it before leave.
Hope it can be common.
|
|
|
|
|
I have a dialog with two list controls, where i have drag and drop from one list control to other, i am using COleDropTarget object to do this. But i have to restrict user to drag and drop from explorer.
Note: If i run application with "run as administrator", list control is restricted the drop, but run as invoker list control is accepting files and folders.
How can we avoid drag and drop from explorer with out running as administrator?
Thanks.
----------------------------
KRISHNA KUMAR T M
|
|
|
|
|
Check out things like RevokeDragDrop() , DoDragDrop() , and IDropSource .
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"Man who follows car will be exhausted." - Confucius
|
|
|
|
|
Hi All,
I have to use a DLL which exporting classes and need to make a wrapper.
I got .DLL and .EXP file.
I have used previously in a with .Lib file.
please suggest me how can i use exported class using .EXP and .DLL without .LIB file.
Thanks
Bankey
|
|
|
|
|
You've already posted this below... But you can create a lib file from a dll file. Your question should be how to create the lib and include your compiler...
|
|
|
|
|
Hi All,
I want to use some data structures library written in C. I have tried to download and use GDSL (generic data structure library - GNU ) but could not able to use that . Can you suggest any available data structure library written in C which I can use OR do you have any idea how to generate config.h file for that gdsl. I am stopped by that config.h file. I googled unsuccessfuly
Thanks in Advance.
|
|
|
|
|
pandit84 wrote: but could not able to use that
Why ? if it's simple C code, you should be able to use that nearly effortlessly.
GDSL is for "gnu-ish" systems where they have the autoconf and configure tools; when wanting to use gnu-ish stuff on windows, it requires a bit of tweaking (bad header files, bad types, ... non standard stuff) ...
I would not do it; unless really forced to use C.
Instead, I would learn C++ and the STL library.
M.
Watched code never compiles.
|
|
|
|
|
|
Hi All,
I have Win32 DLL which exporting Classes only but i dont have any header file.
I have only library file and DLL.
Can any body suggest me that, How can i use this DLL in my Win32 DLL?
I am trying to use by loadlibrary but as i know i can get only function address.
Please syggest me.
Thanks
Bankey
|
|
|
|
|
You can't link to the dll explicitely (using LoadLibrary) when the DLL only exports classes (are you sure that there's no function exported that will create a class for you ?). You will need to implicitely link to the dll (linking to the library file) but you'll need the header files. From where is this DLL coming from ?
|
|
|
|
|
bankey1010 wrote: I have Win32 DLL which exporting Classes only but i dont have any header file.
I have only library file and DLL.
Typical but not impossible, you need to create the header file based on information provided by the dll vendor and compile and build your application using same header file and library file.
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow Never mind - my own stupidity is the source of every "problem" - Mixture
cheers,
Alok Gupta
VC Forum Q&A :- I/ IV
Support CRY- Child Relief and You
|
|
|
|
|
I had earlier posted a reply and deleted it after I realised that you have only the library file and DLL but I'll post it again anyway.
If you have source code, you may add two function, one to create the class object and the other to destroy a given class object. Use the first one to create the object and after done with the job, use the second one o destroy it.
|
|
|
|
|
Hi I do not have source code of that, i only have .Exp and .DLL, a document which contains headers declaration so that i can make header file manually.
Also that DLL doen't exporting any function so that i can have class object.
So, I will have Header files and .EXP and .DLL
Please help.
Thanks
Bankey
|
|
|
|
|
So I guess as Cedric said you'll have to have an implicit linking. Is there any particular reason you want to use explicit linking through LoadLibrary?
|
|
|
|
|
Hello Bankey,
your DLL may be a COM object library (inproc server), that does not export classes but publishes interfaces. You don't have to load such a library and you don't need to edit a header file. But your EXP-file may contain the interface descriptions.
Have a look inside the DLL with QuickViewPlus or any HEX editor. If you can see any function like "DllGetClassObject" or "DllRegisterServer" in section "Export-Table" perform the following steps:
1. register your DLL with: regsv32.exe pathto\your.dll
You should get a message like "DLLRegisterserver" in your.DLL succeeded", if not, forget my replay.
2. Your development environment should support the function "Import TypeLib". If you perform this action in your code project while selecting your DLL, a new modul should be created that contains the interface description (basicly *_TLB.*).
After step 1 and without any development environment I would do so:
- run regedit.exe
- select HK_ROOT
- find "your.dll" repeately
- for every exported COM object a key like "HKEY_CLASSES_ROOT\CLSID\{...}\InprocServer32" should be found
- look at subkey "\ProgID": here is the class name like "Scriptung.FileSystemObject"
- now you can create an instance in a simple VBS file with
set oObj = CreateObject(Value_Of_ProgID)
If you have determined the ProgID's in this way, you can use MSOffice VBA editor to include the COM objects by name and explore their interfaces.
Regards
Ralf
|
|
|
|
|
CComboBox m_cmbRemoteFolder;
this->m_cmbRemoteFolder.SetEditText(csRemoteFileURL);
UpdateData(FALSE);
I use it to set the new text to combobox. But the value is not updated in the UI.
If I use the mouse to click the combobox, the text of the combobox is updated.
I donot know why?
|
|
|
|
|
Do you have a data member for the ComboBox as well as a control member? Because if you do then
this->m_cmbRemoteFolder.SetEditText(csRemoteFileURL);
will set the text of the ComobBox as you desire and then
UpdateData(FALSE); will restore it to what it was.
|
|
|
|