|
You have "DLL Hell": different versions of MFC.
There is not way out: You got to recompile the static lib!!!
Greetings from Germany
|
|
|
|
|
Unfortunately this is not the problem - it was from a full recompile. The lowest project compiles fine; when I try and compile the layer above, which depends on it, it then throws out the multiply defined symbols. I already compiled the static lib again {:v(
|
|
|
|
|
Static linking of the MFC is the bug. You cant do that. Blame MS for it!!!
Greetings from Germany
|
|
|
|
|
Hi,
I have written some program in VS6.0, to parse an XML file,
CoInitialize(NULL);
CComPtr<ixmldomdocument> spXMLDOM;
CComPtr<ixmldomnode> spXMLNode;
IXMLDOMAttribute *pIXMLDOMAttribute = NULL;
IXMLDOMElement *pIXMLDOMElement = NULL;
HRESULT hr = spXMLDOM.CoCreateInstance(__uuidof(DOMDocument));
VARIANT_BOOL bSuccess = false;
USES_CONVERSION;
_variant_t fileNameValue=T2W(RegFile);
FILE *fp=fopen(RegFile,"r");
if(fp && !(spXMLDOM->load(fileNameValue,&bSuccess)))
{
hr = spXMLDOM->get_documentElement(&pIXMLDOMElement); _variant_t nameValue;
if(!hr && !(pIXMLDOMElement->getAttribute(CComBSTR(L"source- name"),&nameValue)))
{
if ( nameValue.vt == VT_BSTR )
{
USES_CONVERSION;
sourceName = W2T(nameValue.bstrVal);
}
}
spXMLDOM.Release();
// Stop COM
CoUninitialize();
For this i have installed Microsoft SDK, and i am setting the path of this in Tools->Options->Directories...
It builds correctly from the workspace, but if i try to build from make file using "NMAKE /f "Test.mak" CFG="Test - Win32 Release",
It gives many errors,
some are::
cl.exe @C:\DOCUME~1\chikkall\LOCALS~1\Temp\nma03112.
DCRegistry.cpp
DCRegistry.cpp(386) : error C2065: 'IXMLDOMDocument' : undeclared identifier
DCRegistry.cpp(386) : error C2955: 'CComPtr' : use of class template requires template argu
ment list
C:\PROGRA~1\MICROS~3\VC98\ATL\INCLUDE\atlbase.h(563) : see declaration of 'CComPtr'
DCRegistry.cpp(386) : error C2133: 'spXMLDOM' : unknown size
DCRegistry.cpp(386) : error C2512: 'CComPtr' : no appropriate default constructor available
DCRegistry.cpp(386) : error C2262: 'spXMLDOM' : cannot be destroyed
DCRegistry.cpp(387) : error C2065: 'IXMLDOMNode' : undeclared identifier
DCRegistry.cpp(387) : error C2955: 'CComPtr' : use of class template requires template argu
These errors indicate me that Microsoft SDK directory is not getting linked for building, how to make SDK directory available for build in mak file ????
|
|
|
|
|
One way of doing this is to move the location where you tell the Workspace about the Include directory from Tools->Options->Directories to Project Settings C/C++(tab) Category:Preprocessor Additional include Directories (dont forget to also add the library path to Project Settings Link(tab) Category:Input Additional Library Path) and then save the workspace and Export Makefile. This will add the neccessary directory paths to the .MAK file.
The other way is to change the environment variables INCLUDE and LIB that VCVARS32.BAT sets up.
|
|
|
|
|
SUPERB!!!!!
EXCELLENT answer,.............i followed your method 1, it works i am able to build thro make file...
THANKS A LOOOOOOOOOTTTT!!!!!!!!!!!
|
|
|
|
|
Hi all!
I wrote something like 3D Engine with Delphi, but I had to use a C++ DLL for loading GLSL shaders, because it seemed impossible to write it on delphi (problem with text files and PCHAR-s)
so, now my DLL or app doesn't crash, but shaders work incorrectly.
Do anyone know what can be the reason?
Here's my DLL (MS Vcpp 6.0)
#include "stdafx.h"<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <windows.h><br />
#include <string.h><br />
#include <iostream.h><br />
<br />
#include <glew\glew.h><br />
<br />
BOOL APIENTRY DllMain( HANDLE hModule, <br />
DWORD ul_reason_for_call, <br />
LPVOID lpReserved<br />
)<br />
{<br />
return TRUE;<br />
}<br />
<br />
struct TshaderDescribtor<br />
{<br />
int Shader_prog; <br />
int Shader_vert;<br />
int Shader_frag;<br />
char *info;<br />
};<br />
<br />
bool glewinited=false;<br />
<br />
char *textFileRead(char *fn) {<br />
<br />
FILE *fp;<br />
char *content = NULL;<br />
<br />
int count=0;<br />
<br />
if (fn != NULL) {<br />
fp = fopen(fn,"rt");<br />
<br />
if (fp != NULL) {<br />
<br />
fseek(fp, 0, SEEK_END);<br />
count = ftell(fp);<br />
rewind(fp);<br />
<br />
if (count > 0) {<br />
content = (char *)malloc(sizeof(char) * (count+1));<br />
count = fread(content,sizeof(char),count,fp);<br />
content[count] = '\0';<br />
}<br />
fclose(fp);<br />
}<br />
}<br />
return content;<br />
}<br />
<br />
extern "C"<br />
{<br />
void __declspec(dllexport) __cdecl writeln(char *text,bool endline)<br />
{<br />
if (endline)<br />
cout << endl;<br />
printf(text);<br />
}<br />
<br />
void __declspec(dllexport) __cdecl InitGlew()<br />
{<br />
glewInit();<br />
glewinited=true;<br />
}<br />
<br />
<br />
void __declspec(dllexport) __cdecl LoadTextFile(char *fn, char *content) {<br />
content = textFileRead(fn); <br />
}<br />
<br />
TshaderDescribtor _declspec(dllexport) __cdecl glocLoadShaders(char *vertfile,char *fragfile,int testsize,bool useprog)<br />
{<br />
TshaderDescribtor tmpshader; <br />
if (glewinited)<br />
{<br />
tmpshader.Shader_vert = glCreateShader(GL_VERTEX_SHADER);<br />
tmpshader.Shader_frag = glCreateShader(GL_FRAGMENT_SHADER);<br />
<br />
BOOL fileloaded = true;<br />
<br />
char * vs;<br />
char * fs;<br />
<br />
vs = textFileRead(vertfile);<br />
fs = textFileRead(fragfile);<br />
<br />
writeln("vertex shader filename:",true);<br />
writeln(vertfile,true);<br />
writeln("vertex shader source:",true);<br />
writeln(vs,true);<br />
<br />
writeln("fragment shader filename:",true);<br />
writeln(fragfile,true);<br />
writeln("fragment shader source:",true);<br />
writeln(fs,true); <br />
<br />
const char * vv = vs;<br />
const char * ff = fs;<br />
<br />
glShaderSource(tmpshader.Shader_vert, 1, &vv,NULL);<br />
glShaderSource(tmpshader.Shader_frag, 1, &ff,NULL);<br />
<br />
free(vs);free(fs);<br />
<br />
glCompileShader(tmpshader.Shader_vert);<br />
glCompileShader(tmpshader.Shader_frag);<br />
<br />
tmpshader.Shader_prog = glCreateProgram();<br />
<br />
glAttachShader(tmpshader.Shader_prog,tmpshader.Shader_vert);<br />
glAttachShader(tmpshader.Shader_prog,tmpshader.Shader_frag);<br />
<br />
glLinkProgram(tmpshader.Shader_prog);<br />
if (useprog)<br />
glUseProgram(tmpshader.Shader_prog);<br />
tmpshader.info="AEEEEE! :D";<br />
} <br />
else<br />
writeln("GLEW is not initialized! (did you forget to call 'InitGlew?')",true);<br />
return tmpshader;<br />
}<br />
}<br />
<br />
and I use it so:
<br />
procedure setshaderparameters(progobj:integer);<br />
begin<br />
glActiveTexture(GL_TEXTURE0);<br />
glBindTexture(GL_TEXTURE_2D, texture[8]);<br />
tex1_loc := glGetUniformLocation(s_prog, 'TextureUnit0');<br />
glUniform1i(tex1_loc, 0);<br />
<br />
glActiveTexture(GL_TEXTURE1);<br />
glBindTexture(GL_TEXTURE_2D, texture[9]);<br />
tex2_loc := glGetUniformLocation(s_prog, 'TextureUnit1');<br />
glUniform1i(tex2_loc, 1);<br />
<br />
efcoe_loc := glGetUniformLocation(progobj,'efcoe');<br />
<br />
time_loc := glGetUniformLocation(progobj,'TIME_FROM_INIT'); <br />
glUniform1iARB(tex1_loc,texture[8]);<br />
glUniform1iARB(tex2_loc, texture[9]);<br />
<br />
<br />
end;<br />
<br />
procedure LoadShaders()<br />
begin<br />
tmpshad:=glocLoadShaders(pchar(cur_dir+'\shaders\toon_vert.txt'),pchar(cur_dir+'\shaders\toon_frag.txt'),1,false);<br />
end;<br />
Thanks "by force"
|
|
|
|
|
In my app, I need better data type for data with both integer and factional part - in general, we use double for it - but double is not good enough for my app.
For example, an data is changed by C++ automatically if it is over 2^32 with or without fractional part.
in <float.h>, I see data type "long double".
but the "long double" is not working - sizeof(long double) is 8, siame as sizeof(double).
any suggestion for a better data type to replace "double" in my app?
|
|
|
|
|
you'll have to either write your own type, or find and use a Mathematics Library which provides a larger floating point type...
|
|
|
|
|
includeh10 wrote: In my app, I need better data type for data with both integer and factional part
If you can get away with a fixed number of decimal digits, you could use a scaled 64Bit integer.
E.G. If you have money, you convert any numbers in from dollars to cent (multiply be 100), and store this number as an integer.
TO display, you divide by 100.
Though I speak with the tongues of men and of angels, and have not money, I am become as a sounding brass, or a tinkling cymbal. George Orwell, "Keep the Aspidistra Flying", Opening words
|
|
|
|
|
Range of 'double': 1.7E +/- 308 (15 digits)
'long double' currently is simply 'double'.
Write your cstom class it can be the right way...but it request a lot of work.
A simple way to write your custom class is use the standard math on 'double' provided, using the relations A=B*C and/or A=B+C where B and C are 'double'.
class MYLongDouble{
double B;
double C;
Operation operation; <- this to simply indicate if B+C or B*C or...
...
}
So A will became a very big 'double'. Many functions as sin cos tan exp log ... can be easily implemented in that class:
A2=log(A)=log(B*C)=log(B)+log(C)=B2+C2
Russell
|
|
|
|
|
includeh10 wrote: ...double is not good enough for my app.
If you mean it is too small, will this help?
"A good athlete is the result of a good and worthy opponent." - David Crow
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
How to initilize const member variable in class,
in constructor also it;s not possible.
Thanks..
|
|
|
|
|
use initialization list.
eg:
class ABC<br />
{<br />
private:<br />
const int x;<br />
<br />
ABC():x(10)<br />
{<br />
}<br />
}
|
|
|
|
|
thankXXX
There Is Nothing Right & Wrong
|
|
|
|
|
in constructor's body, it's not, but in the constructor's initialization list, you can (and you must)
|
|
|
|
|
abhijit bhopale wrote: How to initilize const member variable in class,
in constructor also it;s not possible.
Along with other answers, you can use also enums...
enum{ AConstantValue = 100, AnotherConstantValue = 20 };
|
|
|
|
|
|
Hello everyone,
I am developing a DLL and I implement a class in the DLL. I am wondering in the two situations,
1. DLL is loaded by a single process multiple times
2. DLL is loaded a couple of times by multiple process
How much times will the constructor be invoked? I want to learn how objects inside a DLL is shared between different process. Is it possible to make multiple process share one single class (class is defined in DLL) object instance?
thanks in advance,
George
|
|
|
|
|
George_George wrote: 1. DLL is loaded by a single process multiple times
A single will load the dll only once.
George_George wrote: How much times will the constructor be invoked
If you have create only class, the costructor will never be called. You have to create an object of the class.
George_George wrote: Is it possible to make multiple process share one single class (class is defined in DLL) object instance?
We can share a data section in a dll among various process. see here[^]
|
|
|
|
|
Thanks nave,
Naveen.R wrote: A single will load the dll only once.
I mean for a specific process, if it invokes LoadLibrary multiple times without invoking unLoadLibrary, the DLL will be loaded multiple times or once one time?
Naveen.R wrote: If you have create only class, the costructor will never be called. You have to create an object of the class.
Sure, I create object (instance) of a class. I want to know if I make the class a singleton class, if the DLL is loaded by multiple processes, each process will have a separate copy of the singleton class object?
regards,
George
|
|
|
|
|
George_George wrote: the DLL will be loaded multiple times or once one time?
One time only.
George_George wrote: if the DLL is loaded by multiple processes, each process will have a separate copy of the singleton class object?
Offcourse multiple copy.
|
|
|
|
|
Thanks nave,
So, making a class singleton does not make an instance (object) shared between multiple process, right?
I have read through the article you recommended. And I learned that we can use #pragma data_seg to make a shared data segment. But I have not found any information about how to synchronize the acces of the data between multiple process (lockig?)? Any reference or samples?
regards,
George
|
|
|
|
|
May be you have to synchronize it using some mutex. Samples.. have to search
|
|
|
|
|
Thanks nave,
I noticed when using #pragma data_seg, all the shared data are global data. But when we use mutex, we need to use it in a function. I do not know how to use mutex outside a function and apply mutex to global data.
Any comments or ideas?
regards,
George
|
|
|
|
|