|
I have an openGL window within an MFC dialog. I've connected to MSAccess as my DB where i pick coordinates which i use to draw GL_LINES and GL_QUADS.
I've checked out my code and it seems to be working correctly but nothing shows on the GLWindow. Wne i hardcode values ... it shows sometimes and other times it doesn't. Might anyone know what i'm doing wrong here?
Any help would be highly appreciated...
My code for connecting and drawing is as follows:
<br />
<br />
<br />
HRESULT hr;<br />
CoInitialize(NULL);<br />
<br />
try{<br />
hr = cnSURMPtr2.CreateInstance(__uuidof(ADODB::Connection));<br />
if (FAILED(hr))<br />
{<br />
throw _com_error(hr);<br />
}<br />
<br />
hr = rsObjectsPtr.CreateInstance(__uuidof(ADODB::Recordset));<br />
if (FAILED(hr))<br />
{<br />
throw _com_error(hr);<br />
}<br />
<br />
cnSURMPtr2->CursorLocation = ADODB::adUseClient;<br />
<br />
_bstr_t dbLocation(L"");<br />
dbLocation = (L".\\SURM.mdb");<br />
<br />
cnSURMPtr2->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+ dbLocation +";Persist Security Info=False","","",ADODB::adConnectUnspecified);<br />
<br />
rsObjectsPtr->Open("SELECT * from Objects", cnSURMPtr2.GetInterfacePtr(),<br />
ADODB::adOpenDynamic, ADODB::adLockOptimistic, ADODB::adCmdText);<br />
<br />
if(!rsObjectsPtr->ADOEOF){<br />
if(rsObjectsPtr->GetRecordCount()>0){<br />
while (rsObjectsPtr->ADOEOF == false){<br />
_variant_t myCoordinates;<br />
<br />
myCoordinates = rsObjectsPtr->GetCollect(L"Coordinates");<br />
<br />
if(myCoordinates.vt != VT_NULL){<br />
CString myStrCoords;<br />
<br />
myStrCoords = static_cast<char *>(_bstr_t(myCoordinates.bstrVal));<br />
<br />
int myArraySize = (myStrCoords.GetLength()/9);<br />
CString *singleCoord = new CString[myArraySize];<br />
int tokenCounter = 0;<br />
<br />
while(myStrCoords.GetLength()>=9){<br />
singleCoord[tokenCounter] = myStrCoords.Left(9);<br />
myStrCoords.Delete(0,10);<br />
tokenCounter++;<br />
}<br />
<br />
if(tokenCounter<=2){<br />
drawLine((string)singleCoord[0],(string)singleCoord[0]);<br />
}<br />
else{<br />
drawQuad((string)singleCoord[0],(string)singleCoord[1],(string)singleCoord[2],(string)singleCoord[3]);<br />
drawQuad("000001000","000001001","000000001","000000000");<br />
}<br />
}
rsObjectsPtr->MoveNext();<br />
}<br />
if(rsObjectsPtr->BOF){<br />
rsObjectsPtr->MoveFirst();<br />
}<br />
if(rsObjectsPtr->ADOEOF){<br />
rsObjectsPtr->MoveLast();<br />
}<br />
};<br />
}<br />
}<br />
catch(_com_error &e)<br />
{<br />
<br />
AfxMessageBox(static_cast<char *>(e.Description()));<br />
}<br />
catch(...)<br />
{<br />
AfxMessageBox("Unhandled Exception");<br />
};<br />
<br />
<br />
drawQuad("000001000","000001001","000000001","000000000");<br />
<br />
SwapBuffers(dc->m_hDC);<br />
}<br />
<br />
This is the code for drawing the QUAD
<br />
void COpenGLControl::drawQuad(string Coord_A, string Coord_B, string Coord_C, string Coord_D){<br />
<br />
<br />
float myAx = atof(Coord_A.substr(0,3).c_str());<br />
float Ax = (myAx/10);<br />
float myAy = atof(Coord_A.substr(3,3).c_str());<br />
float Ay = (myAy/10);<br />
float myAz = atof(Coord_A.substr(6,3).c_str());<br />
float Az = (myAz/10);<br />
<br />
float myBx = atof(Coord_B.substr(0,3).c_str());<br />
float Bx = (myBx/10);<br />
float myBy = atof(Coord_B.substr(3,3).c_str());<br />
float By = (myBy/10);<br />
float myBz = atof(Coord_B.substr(6,3).c_str());<br />
float Bz = (myBz/10);<br />
<br />
float myCx = atof(Coord_C.substr(0,3).c_str());<br />
float Cx = (myCx/10);<br />
float myCy = atof(Coord_C.substr(3,3).c_str());<br />
float Cy = (myCy/10);<br />
float myCz = atof(Coord_C.substr(6,3).c_str());<br />
float Cz = (myCz/10);<br />
<br />
float myDx = atof(Coord_D.substr(0,3).c_str());<br />
float Dx = (myDx/10);<br />
float myDy = atof(Coord_D.substr(3,3).c_str());<br />
float Dy = (myDy/10);<br />
float myDz = atof(Coord_D.substr(6,3).c_str());<br />
float Dz = (myDz/10);<br />
<br />
glBegin(GL_QUADS);<br />
glColor3f(0.0,1.0,0.0);<br />
<br />
glVertex3f(Ax,Ay,Az);<br />
glVertex3f(Bx,By,Bz);<br />
glVertex3f(Cx,Cy,Cz);<br />
glVertex3f(Dx,Dy,Dz);<br />
glEnd();<br />
}<br />
Thanks in advance...
|
|
|
|
|
The only thing I can think of off the top of my head is the default winding in opengl is counter-clockwise, so you need to draw your quad vertexes in that order, unless you change it to clockwise with glFrontFace(GL_CW).
delete this;
* poof! *
|
|
|
|
|
So I want to enumerate the processes using NtQuerySystemInformation() native api.
I load it from ntdll.dll
i use the process structure below unlike the one documented by microsoft. but i've seen that others use it too.
typedef struct _SYSTEM_PROCESS_INFORMATION
{
DWORD dNext;
DWORD dThreadCount;
DWORD dReserved01;
DWORD dReserved02;
DWORD dReserved03;
DWORD dReserved04;
DWORD dReserved05;
DWORD dReserved06;
QWORD qCreateTime;
QWORD qUserTime;
QWORD qKernelTime;
UNICODE_STRING usName;
DWORD BasePriority;
DWORD dUniqueProcessId;
DWORD dInheritedFromUniqueProcessId;
DWORD dHandleCount;
DWORD dReserved07;
DWORD dReserved08;
VM_COUNTERS VmCounters;
DWORD dCommitCharge;
SYSTEM_THREAD Threads[1];
} SYSTEM_PROCESS_INFORMATION;
the thing is that when I call it I don't get any error code or null pointers but the structure's members are zeros.
the dNext member is not zero but I can't obtain the next pointer for another system_process_information because i get the invalid pointer error when I try this:
if (ProcessInfo->dNext!=0)
ProcessInfo=(SYSTEM_PROCESS_INFORMATION_DEF *)((ULONG *)ProcessInfo+ProcessInfo->dNext);
And I have another question.
How much space should I allocate for the ProcessInfo structure
i only allocate for one structure
SYSTEM_PROCESS_INFORMATION *ProcessInfo=(SYSTEM_PROCESS_INFORMATION *)malloc(sizeof(SYSTEM_PROCESS_INFORMATION));
or I shouldn't allocate at all. I will obtain a pointer to the structure anyway ?
here is the code I use:
HMODULE ntHinst;
ntHinst=LoadLibraryA(NTDLL);
if (ntHinst==NULL)
{
MessageBoxA(GetDesktopWindow(),"Error loading ntdll\nThe program will now end","ERROR",MB_ICONSTOP);
return 0;
}
_NtQuerySystemInformation=(NTQUERYSYSTEMINFORMATION)GetProcAddress(ntHinst,"NtQuerySystemInformation");
if(!_NtQuerySystemInformation)
{
MessageBoxA(GetDesktopWindow(),"Error obtaining function pointer\nThe program will now terminate","ERROR",MB_ICONSTOP);
return 0;
}
SYSTEM_PROCESS_INFORMATION *ProcessInfo=(SYSTEM_PROCESS_INFORMATION *)malloc(sizeof(SYSTEM_PROCESS_INFORMATION);
if (IsBadReadPtr(ProcessInfo,sizeof(SYSTEM_PROCESS_INFORMATION))||IsBadWritePtr(ProcessInfo,sizeof(SYSTEM_PROCESS_INFORMATION)))
return 0;
_NtQuerySystemInformation(SystemProcessInformation ,(PVOID)ProcessInfo,sizeof(SYSTEM_PROCESS_INFORMATION),&ret);
if (ret==0)
{
MessageBoxA(GetDesktopWindow(),"Function Call Failed: NtQuerySystemInformation\nThe program will now terminate","ERROR",MB_ICONSTOP);
return 0;
}
if(ProcessInfo==NULL)
{
MessageBoxA(GetDesktopWindow(),"Function Call Failed: NtQuerySystemInformation\nThe program will now terminate","ERROR",MB_ICONSTOP);
return 0;
}
while(ProcessInfo!=NULL)
{
//RtlUnicodeStringToOemString(usname,&ProcessInfo->usName,TRUE);
//MessageBoxA(0,usname->Buffer,"",MB_OK);
//RtlFreeOemString(usname);
HANDLE hProc;
hProc=OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,ProcessInfo->dUniqueProcessId);
if (hProc!=NULL)
{
HMODULE hmods[300];
DWORD retv;
char fname[1024];
EnumProcessModules(hProc,hmods,sizeof(hmods),&retv);
retv=retv/sizeof(DWORD);
GetModuleFileNameA(*hmods,fname,sizeof(fname));
MessageBoxA(GetDesktopWindow(),fname,"Process Name",MB_OK);
}
else if (ProcessInfo->dNext!=0)
ProcessInfo=(SYSTEM_PROCESS_INFORMATION_DEF *)((ULONG *)ProcessInfo+ProcessInfo->dNext);
else
ProcessInfo=NULL;
if (ProcessInfo->dNext!=0)
ProcessInfo=(SYSTEM_PROCESS_INFORMATION_DEF *)((ULONG *)ProcessInfo+ProcessInfo->dNext);
else
ProcessInfo=NULL;
}
free(ProcessInfo);
So I get no errors durin calling. but I also get a structure full of zero's.
What is the pb ?
gabby
|
|
|
|
|
Please,
Can anyone tell me where I can find the resource of the CFileDialog. I don't need the resource found in VC++ samples. I need the original one.
M.N
|
|
|
|
|
"COMMDLG.DLL" contains the resource of CFileDialog and all other common dialogs.
nave
|
|
|
|
|
Thanks nave, but I think that these dialogs are not that used by a program like notepad.
Any way, if there is no other resources, can anybody help me showing the Places Pane when I use a custom CFileDialog template.
M.N
|
|
|
|
|
hello,
i have a class with a bool in it. how can i access the bool (and change its value) from another class? if i try
OtherClass::somebool = false; then i get an error:
error c2597: illegal reference to non-static member 'OtherClass::somebool'
thanks in advance,
sam kline
|
|
|
|
|
Base on the error message, seems like the OtherClass is not instantiated yet.
|
|
|
|
|
|
i did this and it works:
OtherClass SomeClass;
SomeClass.somebool = true;
sam kline
|
|
|
|
|
Ahaa! But do you understatnd why the solution works?
INTP
Every thing is relative...
|
|
|
|
|
hi Sam,
Actually what u r tring first is u r using static member access method for non static member.
Regards,
Divyang Mithaiwala.
|
|
|
|
|
Hello Everyone!! what should i do to generate an opengl terrain in an MFC window. Ive built an opengl window inside my dialog but now i wna display the terrain inside it. Please help!!
Thanks in advance
Aman N
|
|
|
|
|
Hi! I have a problem using a few overloaded functions located in a DLL that I created. The source code for the DLL looks like this:
<br />
#if defined MYDLL_EXPORTS<br />
#define MYDLL_API __declspec( dllexport )<br />
#else<br />
#define MYDLL_API __declspec( dllimport )<br />
#endif<br />
<br />
MYDLL_API __int8 __cdecl readNumber( __int32 &destinationNumber );<br />
MYDLL_API __int8 __cdecl readNumber( double &destinationNumber );
The next lines go in myDll.cpp:
<br />
#include <iostream><br />
#include "myDll.h"<br />
<br />
MYDLL_API __int8 __cdecl readNumber( __int32 &destinationNumber )<br />
{<br />
std::cin >> destinationNumber;<br />
if ( std::cin.bad( ) )<br />
return 0;<br />
<br />
return 1;<br />
}<br />
<br />
MYDLL_API __int8 __cdecl readNumber( double &destinationNumber )<br />
{<br />
std::cin >> destinationNumber;<br />
if ( std::cin.bad( ) )<br />
return 0;<br />
<br />
return 1;<br />
}
It works just fine if I use load-time linking (by linking the myDll.lib too). But what I want to do is use run-time linking, like below:
<br />
#include <windows.h><br />
#include "myDll.h"<br />
<br />
typedef __int8 (__cdecl *ReadInt32NumberFunction( __int32 &destinationNumber );<br />
typedef __int8 (__cdecl *ReadDoubleNumberFunction( double &destinationNumber );<br />
<br />
int main( void )<br />
{<br />
HMODULE moduleHandle;<br />
ReadInt32NumberFunction readInt32Number;<br />
ReadDoubleNumberFunction readDoubleNumber;<br />
__int32 int32Value;<br />
double doubleValue;<br />
<br />
moduleHandle = LoadLibrary( "myDll.dll" );<br />
if ( moduleHandle != NULL )<br />
{<br />
readInt32Number = (ReadInt32NumberFunction)GetProcAddress( moduleHandle, "readNumber" );<br />
readDoubleNumber = (ReadDoubleNumberFunction)GetProcAddress( moduleHandle, "readNumber" );<br />
FreeLibrary( moduleHandle );<br />
}<br />
<br />
return 0;<br />
}
The problem is that both readInt32Number and readDoubleNumber are NULL after calling GetProcAddress. It works if I declare those two functions as extern "C" in myDll.cpp, but then, I cannot use function overloading.
Another problem is that if I want to call readNumber( ) with a __int32 and a double parameter, I must do something like this:
readInt32Number( int32Value );<br />
readDoubleNumber( doubleValue );
I would like to use those two overloaded functions with their own names, like this:
readNumber( int32Value );<br />
readNumber( doubleValue );
Even though all these problems are solved using load-time linking, I DO NOT want to use it. Instead, I would like run-time linking, with LoadLibrary(), GetProcAddress() and FreeLibrary().
Can anyone help me with this, please? Thanks in advance!
|
|
|
|
|
When you use function overloading, the compiler generates a 'decorated' name for the function based upon the actual function name and the argument signature. Using your function names, the compiler might generate the name 'readNumber@4 ' for 'readNumber(int) ', and 'readNumber@8 ' for 'readNumber(double) '. This lets the linker, which doesn't know anything about function overloading, tell the two functions part.
This should tell you why dynamic loading based on the name 'readNumber ' alone isn't going to work. There's no way for the loader to know which version of the function you are asking for.
The simplest solution is to continue using the extern "C" approach you have been, and 'decorate' the names yourself.
Software Zen: delete this;
|
|
|
|
|
|
How do i convert an integer to string?
Is that really necesary if i want to paint some integer values on a win32 programm? or is there some function similar to TextOut that can paint integer values?
Thank you
|
|
|
|
|
Use itoa() or sprintf() to convert an integer to a string.
Pacificat0r wrote: Is that really necesary if i want to paint some integer values on a win32 programm? or is there some function similar to TextOut that can paint integer values?
Yes, it is necessary. If you think about it, it doesn't make sense for the Windows API to provide a 'paint an integer' function in addition to all of the 'paint text' functions. 'Paint text' functionality supports anything that can be represented as text. Converting that 'anything' to text is just a second operation that can be implemented separately, and doesn't have to be maintained as part of the Windows API.
Software Zen: delete this;
|
|
|
|
|
I'd do it like this:
std::ostringstream ss;
ss << "The number is " << 42;
TextOut(hDC, 0, 0, ss.str().c_str(), ss.str().length());
Naturally you'll need to include <sstream>
Steve
|
|
|
|
|
|
This is silly! Yes it is necessary, but the programming language or the compiler vender may provide a method for doing it for you (another programmer). If you really want to be a programmer, then you should be able to recreate the code to do the conversion. The others have showed you the methods provided to do the conversion (which you should use), but you are not a programmer until you can write a method to do it your self.
INTP
Every thing is relative...
|
|
|
|
|
thank you for your help
|
|
|
|
|
Hi one, hi all!
I have recently ported from WiInet to WinHttp in my server application.
Everything works just fine but there is one major question regarding some flags that were set in the WinInet HttpOpenRequest(…). The dwFlags had values of INTERNET_FLAG_KEEP_CONNECTION and INTERNET_FLAG_NO_CACHE_WRITE which I need to use, the problem is I can not find the equivalent in the WinHttp API protocol!!! I was told to add it the Headers of the request in format of:
"Content-Type: application/x-www-form-urlencoded\r\n Connection : Keep-Alive\r\n Cache-Control: no-cache"
but it seems rather strange to set flags as part of the message sent to the server!
Any one?
Thanks
S
|
|
|
|
|
|
You've got a couple options here.
1. If the file is relatively small, read the entire file into a string and then use one of the string search functions (like strstr ) to find the opening marker <<A>>. Extract the data from where you find it.
2. If the file is large, read it a chunk at a time. Look for the first character in the marker in the chunk. If you find it, read enough more out of the file, appending to the chunk, that you're sure you have all of the data you're interested in. Extract the data.
3. Given your example, it almost sounds like you're trying to read XML. If that's the case, there's plenty of code around for helping you do that.
Software Zen: delete this;
|
|
|
|
|