|
Hey,
I have a related question.
How do you deal with Unicode issues?
I think (am I wrong?) that some system (or at least Microsoft) DLLs come in two flavors - Unicode and ANSI. Suppose that my application is compiled as an ANSI application, and I want to distribute it with a set of compatible DLLs - how do I avoid overwriting ANSI versions of DLLs with Unicode versions, and vice versa?
Also - where can I find the redistributable DLLs? (MS surely doesn't expect me to copy them from my HD, do they?)
Thanks!
|
|
|
|
|
Yep, Unicode is an issue. However, the DLLs are actually named differently. If you look in C:\winnt\system32 (or equivalent) on the machine where you installed VC++, you'll find that along with MFC42.DLL there is also a file called MFC42U.DLL, the Unicode version. Similarly for all the VC++ related DLLs. Basically, when you build a Unicode version of your program, it it linked against the Unicode DLLs. Therefore, if you try to run a Unicode program on a non-Unicode system, it will fail.
Anyway, what I'm getting at is that if you build a non-Unicode application, you can update MFC42.DLL without a problem, since it is non-unicode.
As for the redistributable files, in fact, the recommended way is to copy them from your VC++ CD. Do a search for "Redistributable Files" in MSDN and you'll find more info. The list of files allowed for redistribution can be found in the Program Files / MS Visual Studio folder and is called redist.txt.
Hope this helps.
------------------------
Derek Waters
derek@lj-oz.com
|
|
|
|
|
Use depends or dumpbin to see what modules you might need to include. There might also be version differences between modules in your build environment and on the target system.
In debug build some of the modules might be linked as their debug correspondance, for example mfc42d.dll instead of mfc42.dll.
/moliate
|
|
|
|
|
OK, I've got some code which I cut and paste straight from the MSDN documentation on the static C++ keyword.....and it won't link
can anyone work out why? This is the code:
class SavingsAccount
{
public:
static void setInterest( float newValue )
{ currentRate = newValue; }
private:
char name[30];
float total;
static float currentRate;
};
float SavingsAccount::currentRate = 0.00154;
I copied it into a header file, and I'm getting the following errors
Tracker.obj : error LNK2005: "private: static float SavingsAccount::currentRate" (?currentRate@SavingsAccount@@0MA) already defined in Capture.obj
Tracker.obj : error LNK2005: "protected: static int CTracker::a" (?a@CTracker@@1HA) already defined in Capture.obj
Tracker.obj : warning LNK4006: "private: static float SavingsAccount::currentRate" (?currentRate@SavingsAccount@@0MA) already defined in Capture.obj; second definition ignored
By the way, this isn't just me nitpicking at MSDN, I have a very similar class that throws up the same errors, and I need to know why!
TIA,
Pete
|
|
|
|
|
this line:
float SavingsAccount::currentRate = 0.00154;
Needs to be placed into your .cpp file.
Currently it is in your header file. When it gets included into multiple files the linker tries to allocate multiple instances of the static variable, and that is why you are seeing that probrlm.
|
|
|
|
|
Thanks!
Ok, so if you have a static member variable then it has to be provided with a global definition, which is what that line does, right? But what if the variable is a user-defined type? I'm getting LNK2001 errors for all of the static variables of user-defined types in my class. I'm guessing it's because VC++ doesn't know how to initialize them correctly. So here's what I've tried so far - The variables are declared in my header file as follows:
class CTracker
{
...
protected:
...
static C2DPoint **m_aCentroids;
static double ***m_aCentroidDirs;
static UINT *m_aNumPoints;
...
};
I then initialize them in my cpp file like this:
static C2DPoint CTracker::**m_aCentroids = NULL;
static double CTracker::***m_aCentroidDirs = NULL;
static UINT CTracker::*m_aNumPoints = NULL;
but i'm still getting errors like the following:
error LNK2001: unresolved external symbol "protected: static class C2DPoint * * CTracker::m_aCentroids" (?m_aCentroids@CTracker@@1PAPAVC2DPoint@@A)
Any idea why?
Oh, and thanks again for your help so far (with this /and/ the function pointer thing!).
Pete
|
|
|
|
|
In your CPP file, you don't need the static on the front, and I think you've got the *s in the wrong place:
C2DPoint **CTracker::m_aCentroids = NULL;
double ***CTracker::m_aCentroidDirs = NULL;
UINT *CTracker::m_aNumPoints = NULL;<pre>
Hope this helps.
------------------------
Derek Waters
derek@lj-oz.com
|
|
|
|
|
Yep, that hit the spot!
Thanks a lot Derek.
|
|
|
|
|
Anyone every had to write a program in C++ to funciton like an assembler to take in machine code instructions??
meeooow
|
|
|
|
|
I have created several Document Templates in my MDI application, and I am creating a new document programmatically by calling CWinApp::OnFileNew().
The application stucks a dialog box into my face where I have to choose the template that I would like to use. I would like to avoid seeing this dialog box by supplying the document template that I would like to use programmatically.
Could anyone help me with this problem? Thank you.
|
|
|
|
|
Just call CDocTemplate::OpenDocumentFile and pass NULL as 1st parameter. This will create new document.
Tomasz Sowinski -- http://www.shooltz.com
- It's for protection - Protection from what? Zee Germans?
|
|
|
|
|
I am loading alot of stuff during my CWinApp::OnInitInstance(), and i'd like to know how to close the program on certain errors, could someone tell me what message I need to throw?
thanks!
-dz
|
|
|
|
|
Doesn't CWinApp::InitInstance return a BOOL ? Just return FALSE....
Christian
The tragedy of cyberspace - that so much can travel so far, and yet mean so little.
"I'm somewhat suspicious of STL though. My (test,experimental) program worked first time. Whats that all about??!?!
- Jon Hulatt, 22/3/2002
|
|
|
|
|
i was just about to try to remove this.. sorry, realized just return false after reading through the generated code, thanks for the help!
-dz
|
|
|
|
|
WM_CLOSE
Mazy
"The path you tread is narrow and the drop is shear and very high,
The ravens all are watching from a vantage point near by,
Apprehension creeping like a choo-train uo your spine,
Will the tightrope reach the end;will the final cuplet rhyme?"Cymbaline-Pink Floyd
|
|
|
|
|
I tried to use the getAttribute method from IHTMLElement interface, but I saw that this method could retrive only the defined attributes (like id, bgcolor) and not my own attributes (like temp, userid)
|
|
|
|
|
Hi
is it possible to create a window from a DLL?
The window shall display some debug output in this window, but I can't get it to work.
This is what I have so far, but it doesn't work
long WINAPI WindowProc(HWND hWnd, UINT wMessage, WPARAM wParam, LPARAM lParam)
{
return DefWindowProc(hWnd, wMessage, wParam, lParam);
}
void CreateLogWindow()
{
static char szAppName[] = "LogWindow" ;
HWND hWnd;
WNDCLASS WndClass;
WndClass.style = CS_HREDRAW | CS_VREDRAW;
WndClass.lpfnWndProc = WindowProc;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH);
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
WndClass.hIcon = 0;
WndClass.hInstance = hInstance;
WndClass.lpszClassName = "Testprogramm";
WndClass.lpszMenuName = NULL;
RegisterClass(&WndClass);
hWnd = CreateWindow(
"LogWindow",
"LogWindow",
WS_CAPTION | WS_THICKFRAME | WS_VISIBLE,
0,
0,
250,
250,
NULL,
NULL,
hInstance,
NULL
);
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
SetFocus(hWnd);
}
Any help is greatly appreciated
regards
modified 12-Sep-18 21:01pm.
|
|
|
|
|
If you move this code to .exe, does it work OK?
Tomasz Sowinski -- http://www.shooltz.com
- It's for protection - Protection from what? Zee Germans?
|
|
|
|
|
Inside an .exe it works fine!
regards
modified 12-Sep-18 21:01pm.
|
|
|
|
|
Try setting the hInstance parameter of the WNDCLASS structure to NULL GetModuleHandle(NULL) .
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
Thanks, but it doesn't work
modified 12-Sep-18 21:01pm.
|
|
|
|
|
And if you replace also the hInstance occurrence in CreateWindow ?
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
Same result, no window is created
modified 12-Sep-18 21:01pm.
|
|
|
|
|
Ummm this is getting weird. In which context is CreateLogWindow being called? Does a message pump exist in the calling EXE? Please note that whether CreateLogWindow is inside a DLL or the EXE itself is immaterial from the system point of view (if you used GetModuleHandle(NULL) throughout), so the behavior observed is really odd.
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
CreateWindow is called from the DllMain function:
BOOL APIENTRY DllMain( HINSTANCE hModule, DWORD dwReason, LPVOID lpReserved )
{
hInstance = hModule;
if (dwReason == DLL_PROCESS_ATTACH)
{
CreateLogWindow(hInstance);
}
else if (dwReason == DLL_PROCESS_DETACH)
{
}
return TRUE;
}
And I think the EXE has a message pump since it has a main window.
Probably there is to mention that my Dll is one using the Microsoft Detours libary. Perhaps you know about it. My Dll attaches itself to an exe and thus can interupt Api calls from the main app and modify them.
This way I want to intercept the send() and sendto() functions in order to watch what the apps are sending. The window I want to create shall display the buffer of send() and sendto()
regards
modified 12-Sep-18 21:01pm.
|
|
|
|