Thread overview
global static pointer variable in DLL
May 17, 2008
Zarathustra
May 17, 2008
torhu
May 17, 2008
Zarathustra
May 17, 2008
torhu
May 18, 2008
Zarathustra
May 18, 2008
torhu
May 17, 2008
Bill Baxter
May 18, 2008
Zarathustra
May 18, 2008
Bill Baxter
May 17, 2008
I have a C DLL whih global static pointer variables.
When I use this DLL with C everything is ok, but when I try to use it (DLL) with D I receive Acces Violation errors.
I do not have any idea what is wrong. If something is inexplicable, You will ask. Please help.

simple example code in dll
gl2ps is global pointer
[code]
if(gl2ps){/*
never true in C but true in D*/}
[/code]

May 17, 2008
Zarathustra wrote:
> I have a C DLL whih global static pointer variables.
> When I use this DLL with C everything is ok, but when I try to use it (DLL) with D I receive Acces Violation errors.
> I do not have any idea what is wrong. If something is inexplicable, You will ask. Please help.
> 
> simple example code in dll
> gl2ps is global pointer
> [code]
> if(gl2ps){/* never true in C but true in D*/}
> [/code]
> 

It's a bit hard to know what the problem is when you don't post some more code.  How do you declare gl2ps in D?  If it's in a C DLL, it should look like this:

export extern extern (C) void* gl2ps;

Replace void* with the correct type, of course.

And in the C code IIRC it should be:

__declspec(dllexport) void* gl2ps;
May 17, 2008
torhu Wrote:

> Zarathustra wrote:
> > I have a C DLL whih global static pointer variables.
> > When I use this DLL with C everything is ok, but when I try to use it (DLL) with D I receive Acces Violation errors.
> > I do not have any idea what is wrong. If something is inexplicable, You will ask. Please help.
> > 
> > simple example code in dll
> > gl2ps is global pointer
> > [code]
> > if(gl2ps){/*
> > never true in C but true in D*/}
> > [/code]
> > 
> 
> It's a bit hard to know what the problem is when you don't post some more code.  How do you declare gl2ps in D?  If it's in a C DLL, it should look like this:
> 
> export extern extern (C) void* gl2ps;
> 
> Replace void* with the correct type, of course.
> 
> And in the C code IIRC it should be:
> 
> __declspec(dllexport) void* gl2ps;

gl2ps is not exported because it is not necessary beyond DLL.
gl2ps declaration in DLL is following:
static GL2PScontext *gl2ps = NULL;
for example:
The crash occurs in exported gl2psBeginPage function. (in attachment)
Declaration of above function in D is following:
extern (C) GLint gl2psBeginPage;	// static linking

DLL is little long but very simple, so I can send it to you.


May 17, 2008
Zarathustra wrote:
> torhu Wrote:
> 
>> Zarathustra wrote:
>> > I have a C DLL whih global static pointer variables.
>> > When I use this DLL with C everything is ok, but when I try to use it (DLL) with D I receive Acces Violation errors.
>> > I do not have any idea what is wrong. If something is inexplicable, You will ask. Please help.
>> > 
>> > simple example code in dll
>> > gl2ps is global pointer
>> > [code]
>> > if(gl2ps){/* never true in C but true in D*/}
>> > [/code]
>> > 

> gl2ps is not exported because it is not necessary beyond DLL.
> gl2ps declaration in DLL is following:
> static GL2PScontext *gl2ps = NULL;
> for example:
> The crash occurs in exported gl2psBeginPage function. (in attachment)
> Declaration of above function in D is following:
> extern (C) GLint gl2psBeginPage;	// static linking
> 
> DLL is little long but very simple, so I can send it to you.

When you say 'crash', do you mean that gl2ps is NULL on line 11 of the attached file?    Then the problem is likely be in the code that initializes gl2ps, not in the gl2psBeginPage function.
May 17, 2008
Zarathustra wrote:
> torhu Wrote:
> 
>> Zarathustra wrote:
>>> I have a C DLL whih global static pointer variables.
>>> When I use this DLL with C everything is ok, but when I try to use it (DLL) with D I receive Acces Violation errors.
>>> I do not have any idea what is wrong. If something is inexplicable, You will ask. Please help.
>>>
>>> simple example code in dll
>>> gl2ps is global pointer
>>> [code]
>>> if(gl2ps){/* never true in C but true in D*/}
>>> [/code]
>>>
>> It's a bit hard to know what the problem is when you don't post some more code.  How do you declare gl2ps in D?  If it's in a C DLL, it should look like this:
>>
>> export extern extern (C) void* gl2ps;
>>
>> Replace void* with the correct type, of course.
>>
>> And in the C code IIRC it should be:
>>
>> __declspec(dllexport) void* gl2ps;
> 
> gl2ps is not exported because it is not necessary beyond DLL.
> gl2ps declaration in DLL is following:
> static GL2PScontext *gl2ps = NULL;
> for example:
> The crash occurs in exported gl2psBeginPage function. (in attachment)
> Declaration of above function in D is following:
> extern (C) GLint gl2psBeginPage;	// static linking
> 
> DLL is little long but very simple, so I can send it to you.

You might be interested in my Frankenstein's hybrid of gl2ps and OGLE. It allows basically allows you to do what gl2ps does, but non-invasively.  I.e. you can gl2ps an OpenGL screen without modifying any source code.

--bb
May 18, 2008
torhu Wrote:

> Zarathustra wrote:
> > torhu Wrote:
> > 
> >> Zarathustra wrote:
> >> > I have a C DLL whih global static pointer variables.
> >> > When I use this DLL with C everything is ok, but when I try to use it (DLL) with D I receive Acces Violation errors.
> >> > I do not have any idea what is wrong. If something is inexplicable, You will ask. Please help.
> >> > 
> >> > simple example code in dll
> >> > gl2ps is global pointer
> >> > [code]
> >> > if(gl2ps){/*
> >> > never true in C but true in D*/}
> >> > [/code]
> >> > 
> 
> > gl2ps is not exported because it is not necessary beyond DLL.
> > gl2ps declaration in DLL is following:
> > static GL2PScontext *gl2ps = NULL;
> > for example:
> > The crash occurs in exported gl2psBeginPage function. (in attachment)
> > Declaration of above function in D is following:
> > extern (C) GLint gl2psBeginPage;	// static linking
> > 
> > DLL is little long but very simple, so I can send it to you.
> 
> When you say 'crash', do you mean that gl2ps is NULL on line 11 of the attached file?    Then the problem is likely be in the code that initializes gl2ps, not in the gl2psBeginPage function.

Oh, I find out something.
The most crashes occur in similar calls (in DLL) like following:
________________________________________________________
offs += fprintf(gl2ps->stream, "%%PDF-1.4\n");
________________________________________________________
it looks like DLL haven't got access to FILE(gl2ps->stream), but why?
The FILE is operand of gl2psBeginPage.
Call of gl2psBeginPage function in my D code is in following function:
________________________________________________________
extern (C) void
SaveFile(){
	FILE* fp;
	int state = GL2PS_OVERFLOW;
	int buffsize = 0;

	try{
		fp = fopen("out.pdf", "wb");
		while(state == GL2PS_OVERFLOW){
			buffsize += 1024*1024;

			gl2psBeginPage(
				"test",
				"gl2psTestSimple",
				null,
				GL2PS_PDF,
				GL2PS_SIMPLE_SORT,
				GL2PS_DRAW_BACKGROUND | GL2PS_USE_CURRENT_VIEWPORT,
				GL_RGBA,
				0,
				null,
				0,
				0,
				0,
				buffsize,
				fp,
				"out.pdf"
			);

			RenderFrame();
			state = gl2psEndPage();
		}
		fclose(fp);
		MessageBoxA(null, "File saved", "Information", MB_OK | MB_ICONINFORMATION);
	}
	catch(Object o){
		MessageBoxA(null, cast(char*)o.toString(), "Critical Error", MB_OK | MB_ICONERROR);
	}
}
________________________________________________________
exactly: gl2ps->stream = fp;

May 18, 2008
Bill Baxter Wrote:

> Zarathustra wrote:
> > torhu Wrote:
> > 
> >> Zarathustra wrote:
> >>> I have a C DLL whih global static pointer variables.
> >>> When I use this DLL with C everything is ok, but when I try to use it (DLL) with D I receive Acces Violation errors.
> >>> I do not have any idea what is wrong. If something is inexplicable, You will ask. Please help.
> >>>
> >>> simple example code in dll
> >>> gl2ps is global pointer
> >>> [code]
> >>> if(gl2ps){/*
> >>> never true in C but true in D*/}
> >>> [/code]
> >>>
> >> It's a bit hard to know what the problem is when you don't post some more code.  How do you declare gl2ps in D?  If it's in a C DLL, it should look like this:
> >>
> >> export extern extern (C) void* gl2ps;
> >>
> >> Replace void* with the correct type, of course.
> >>
> >> And in the C code IIRC it should be:
> >>
> >> __declspec(dllexport) void* gl2ps;
> > 
> > gl2ps is not exported because it is not necessary beyond DLL.
> > gl2ps declaration in DLL is following:
> > static GL2PScontext *gl2ps = NULL;
> > for example:
> > The crash occurs in exported gl2psBeginPage function. (in attachment)
> > Declaration of above function in D is following:
> > extern (C) GLint gl2psBeginPage;	// static linking
> > 
> > DLL is little long but very simple, so I can send it to you.
> 
> You might be interested in my Frankenstein's hybrid of gl2ps and OGLE. It allows basically allows you to do what gl2ps does, but non-invasively.  I.e. you can gl2ps an OpenGL screen without modifying any source code.
> 
> --bb
It sounds good.
Could You tell something more about your Frankenstein's hybrid? Where can i find more information about it?
May 18, 2008
Zarathustra wrote:
> 
> Oh, I find out something.
> The most crashes occur in similar calls (in DLL) like following:
> ________________________________________________________
> offs += fprintf(gl2ps->stream, "%%PDF-1.4\n");
> ________________________________________________________
> it looks like DLL haven't got access to FILE(gl2ps->stream), but why?
> The FILE is operand of gl2psBeginPage.
> Call of gl2psBeginPage function in my D code is in following function:
> ________________________________________________________
> extern (C) void
> SaveFile(){
> 	FILE* fp;
> 	int state = GL2PS_OVERFLOW;
> 	int buffsize = 0;
>             		
> 	try{
> 		fp = fopen("out.pdf", "wb");
> 		while(state == GL2PS_OVERFLOW){
> 			buffsize += 1024*1024;
> 
> 			gl2psBeginPage(
> 				"test", 				"gl2psTestSimple", 				null, 				GL2PS_PDF, 				GL2PS_SIMPLE_SORT,
> 				GL2PS_DRAW_BACKGROUND | GL2PS_USE_CURRENT_VIEWPORT,
> 				GL_RGBA, 				0, 				null, 				0, 				0, 				0, 				buffsize, 				fp, 				"out.pdf"
> 			);
> 			
> 			RenderFrame();
> 			state = gl2psEndPage();
> 		}
> 		fclose(fp);
> 		MessageBoxA(null, "File saved", "Information", MB_OK | MB_ICONINFORMATION);
> 	}
> 	catch(Object o){
> 		MessageBoxA(null, cast(char*)o.toString(), "Critical Error", MB_OK | MB_ICONERROR);
> 	}
> }
> ________________________________________________________
> exactly: gl2ps->stream = fp;
> 

Have you tried debugging this code with ddbg, and checked what the actual values of gl2ps and gl2ps->stream are when it crashes?

http://ddbg.mainia.de/
May 18, 2008
Zarathustra wrote:
> Bill Baxter Wrote:
> 
>> Zarathustra wrote:
>>> torhu Wrote:
>>>
>>>> Zarathustra wrote:
>>>>> I have a C DLL whih global static pointer variables.
>>>>> When I use this DLL with C everything is ok, but when I try to use it (DLL) with D I receive Acces Violation errors.
>>>>> I do not have any idea what is wrong. If something is inexplicable, You will ask. Please help.
>>>>>
>>>>> simple example code in dll
>>>>> gl2ps is global pointer
>>>>> [code]
>>>>> if(gl2ps){/* never true in C but true in D*/}
>>>>> [/code]
>>>>>
>>>> It's a bit hard to know what the problem is when you don't post some more code.  How do you declare gl2ps in D?  If it's in a C DLL, it should look like this:
>>>>
>>>> export extern extern (C) void* gl2ps;
>>>>
>>>> Replace void* with the correct type, of course.
>>>>
>>>> And in the C code IIRC it should be:
>>>>
>>>> __declspec(dllexport) void* gl2ps;
>>> gl2ps is not exported because it is not necessary beyond DLL.
>>> gl2ps declaration in DLL is following:
>>> static GL2PScontext *gl2ps = NULL;
>>> for example:
>>> The crash occurs in exported gl2psBeginPage function. (in attachment)
>>> Declaration of above function in D is following:
>>> extern (C) GLint gl2psBeginPage;	// static linking
>>>
>>> DLL is little long but very simple, so I can send it to you.
>> You might be interested in my Frankenstein's hybrid of gl2ps and OGLE. It allows basically allows you to do what gl2ps does, but non-invasively.  I.e. you can gl2ps an OpenGL screen without modifying any source code.
>>
>> --bb
> It sounds good.
> Could You tell something more about your Frankenstein's hybrid? Where can i find more information about it?

Just something I whipped up because I needed it.  There's no docs or anything at this point (though OGLE, which it is based on can be found here: http://ogle.eyebeamresearch.org/

Put the OpenGL32.dll from in this zip into your program's exe dir
http://www.billbaxter.com/etc/GLGrabber-2008-02-02.zip

And copy a gliconfig.ini from in there to your exe dir too.  Read the gliconfig.ini for some info.  I think by default Ctrl-Shift-F12 is the screen-grab-to-svg keystroke.  You can change the settings in gliConfig.ini to save to PS if you prefer.

--bb