|
Thanks for the explanation!
But What is that error i refered to before???
|
|
|
|
|
That's OK!
I fixed the problem....
I forgot to free() something..
Thanks Anyway!
|
|
|
|
|
Hi,
I have problems getting the Open/Save as common dialogs of an application to work under NT4. The project was compiled under Win2k/XP and VC++ 7.0, and the associated deployment project has detected all dependencies among the .msm packages, and installs them sucessfully in the target computer.
Does anybody knows the trick? Any suggested idea is welcome.
Thanks
|
|
|
|
|
What's the exact problem you're getting? Have you called the CommDlgExtendedError function to see what the error is?
Regards,
Alvaro
The world is a dangerous place, not because of those who do evil, but because of those who look on and do nothing. -- Albert Einstein
|
|
|
|
|
I have met the same problem.
I have searched the help but never found any clue.
I really would be very happy if someone had a solution.
|
|
|
|
|
Hi All,
I've read that you are able to EXPORT functions out of a .exe file and be able to treat them as a dll, being able to Use LoadLibrary, GetProcAddress, and FreeLibrary to access info there.
My problem is that I am able to load the .exe just fine and get a handle to it, I'm then able to successfully get the pointer to the exported function.
My problem is that the data ALWAYS comes out NULL The data I'm trying to get is the compile date and compile time for the exe. I'm really stumped here and have no idea why the information isn't coming back.
Any help, suggestions, comments or insight is greatly appreciated.
Thanks alot!
Dan Willis
|
|
|
|
|
groover4life wrote:
My problem is that the data ALWAYS comes out NULL The data I'm trying to get is the compile date and compile time for the exe. I'm really stumped here and have no idea why the information isn't coming back.
How are you retrieving this data? How does the EXE hold this data? Can you show us some code?
Regards,
Alvaro
The world is a dangerous place, not because of those who do evil, but because of those who look on and do nothing. -- Albert Einstein
|
|
|
|
|
Sure I can.. Here's the code in the EXE that holds the info I want to get:
char *compile_time = __TIME__;
EXPORT char *get_compile_time()
{
return compile_time;
}
with the define in the exe's header being:
EXPORT char *get_compile_time();
Now here is how I'm trying to access it (I left out some garbage in the middle but this is the guts of it):
typedef LPSTR (CALLBACK* LPFNDLLFUNC1)();
hToDLL = LoadLibrary(app);
// If the app doesn't exist, then forgettaboutit
if (hToDLL == NULL) return NULL;
lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hToDLL,"get_compile_time");
if (lpfnDllFunc1 != NULL)
{
// call the function
strResult = lpfnDllFunc1();
if (strResult == NULL) {
err = GetLastError();
return NULL;
}
}
That's how it's being done. I'm doing it in 20 Dlls and I'm having no problems there, the problem only occurrs when I'm loading an exe. The strResult comes back NULL.
Thanks!
Dan Willis
|
|
|
|
|
Hmmmm, I've actually done something similar to this, but not using LoadLibrary. I've linked the DLL with the LIB file from the EXE. So when the DLL is loaded it also loads the EXE, but since the EXE is already running -- the EXE brings up the DLL with LoadLibrary -- then it uses that instance of the EXE instead of loading a separate one.
In your case I'm not really sure of the problem, but it appears as though loading the EXE this way does not load its global variables. Your compile_time variable is global. This may be the root of the problem.
Try doing this instead:
EXPORT char *get_compile_time()
{
return __TIME__;
}
Regards,
Alvaro
The world is a dangerous place, not because of those who do evil, but because of those who look on and do nothing. -- Albert Einstein
|
|
|
|
|
Alvaro Mendez wrote:
Try doing this instead:
EXPORT char *get_compile_time(){ return __TIME__;}
Yeah, I tried doing that as well. I also tried all the types (int,float,double,etc) and also tried returning the information via a pointer on one of the "in" parameters. Still did not work. I also tried running the application and then tried loading it while the exe was running, and that still didn't work.
Alvaro Mendez wrote:
but it appears as though loading the EXE this way does not load its global variables. Your compile_time variable is global. This may be the root of the problem.
My guess is the same. The LoadLibrary function just isn't loading the global variables. But if I make a local anything and try:
return "I am confused";
It still will return a NULL pointer.
So the global memory space still doesn't quite apply based on those tests. Got a Humdinger here. Any other ideas? I'm flat out. I'm looking around for more info on how the global stuff is handled when an app is loaded using LoadLibrary, but I'm not having much luck.
Does anyone have any ideas? Even some insight on the matter? Please help if you can. I really appreciate it.
Dan Willis
|
|
|
|
|
OK, I'm gonna give it a shot. How did you define your EXPORT macro?
Regards,
Alvaro
The world is a dangerous place, not because of those who do evil, but because of those who look on and do nothing. -- Albert Einstein
|
|
|
|
|
#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif
That's how it's defined. Thanks I really appreciate the help.
Dan Willis
|
|
|
|
|
OK, just tried it and it's working fine, even with the global variable!
I put your code into a little EXE (Doodle.exe), compiled it, and then copied it to a second EXE with a different name (Doodle2.exe). Here's the code:
char* compiler_time = __TIME__;
extern "C" __declspec (dllexport) char* get_compile_time()
{
return compiler_time;
}
void CDoodleDlg::OnButtonCallExe()
{
typedef LPSTR (CALLBACK* LPFNDLLFUNC1)();
HINSTANCE hToDLL = LoadLibrary("Doodle2.exe");
if (hToDLL == NULL)
{
AfxMessageBox("Failed to load the app.");
return;
}
LPFNDLLFUNC1 lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hToDLL, "get_compile_time");
if (lpfnDllFunc1 != NULL)
{
char* strResult = lpfnDllFunc1();
if (strResult == NULL)
AfxMessageBox("WTF!");
}
}
Are you sure it's your strResult that comes back NULL and not your lpfnDllFunc1? By the way, I couldn't define the EXPORT macro since MFC already defines it.
Regards,
Alvaro
The world is a dangerous place, not because of those who do evil, but because of those who look on and do nothing. -- Albert Einstein
|
|
|
|
|
LOL I was afraid that would happen. lol. something fishy is going on fer sure.
Alvaro Mendez wrote:
Are you sure it's your strResult that comes back NULL and not your lpfnDllFunc1?
Yes because I've been able to step into the exe code, sit and follow it's execution, and then watch the function return NULL. Everytime.
Well, I think you've gone as far as you can. That does help verify that it must be something funky in my build options or in the application itself that is preventing me for getting at what I need.
I really appreciate your help. Helps me understand a little bit more every day. Thank you very much for that. Guess I have to try from square 1 again
LOL Software never ceases to amaze me. At least I'm not having this problem with my telemetry software.
Once again thank you
Dan Willis
|
|
|
|
|
I'm glad to have helped.
Too bad it didn't uncover the problem.
Regards,
Alvaro
The world is a dangerous place, not because of those who do evil, but because of those who look on and do nothing. -- Albert Einstein
|
|
|
|
|
|
hello all ,
In MDI project, i have always an ChildFrame which is active.
when i press a key i want to activate the view asociate to the childFrame which is active.
You know how to do this?
Thx in advance
|
|
|
|
|
GetActiveView()
Regards,
Alvaro
The world is a dangerous place, not because of those who do evil, but because of those who look on and do nothing. -- Albert Einstein
|
|
|
|
|
Alvaro Mendez wrote:
GetActiveView()
Is not to return the active view ?
in my case i havn't active view, only active frame, and so i want to active the view associated with this frame
|
|
|
|
|
Oh, I see. Then perhaps SetActiveView is what you need.
Regards,
Alvaro
The world is a dangerous place, not because of those who do evil, but because of those who look on and do nothing. -- Albert Einstein
|
|
|
|
|
ok that is what i think but how to use it :
void SetActiveView(
CView* pViewNew,
BOOL bNotify = TRUE
);
I must to get a pointer my view but how to find this?
|
|
|
|
|
Is there a way to create c++ variables out of literals read in from a file? I want to read in a file that has a line that reads CONNECT. I want to make a variable named CONNECT and have the value of 2000 so I can use it in a switch/case statement. I want to be able to create these variables dynamically so that I can eliminate hard-coded values.
Any help will be appreciated,
Ray
|
|
|
|
|
rromero wrote:
Is there a way to create c++ variables out of literals read in from a file?
not at run time.
at compile time you can use the "##" construct to glue two strings together in a macro.
-c
When history comes, it always takes you by surprise.
|
|
|
|
|
There's no way to do it at run-time, but you can go with something like a hash map, where you associate a name ("CONNECT") with a value (2000). Check out the std::map class, which you can define like this:
#include <map>
using namespace std;
typedef map<CString, int> FileVariables;
FileVariables vars;
fv["CONNECT"] = 2000;
fv["DISCONNECT"] = 4000;
if (fv["CONNECT"] > 10000)
....
Regards,
Alvaro
The world is a dangerous place, not because of those who do evil, but because of those who look on and do nothing. -- Albert Einstein
|
|
|
|
|
And where it can be downloaded or a demo can be seen ?
Thanks in regards!
|
|
|
|