1. Andrea Cini's euwingui

Hi

Can't seem to get Andrea Cini's euwingui working with 4 - get a machine level exception with

handle = machine_func(51, {dll, name, args, 0})

and when replaced with

handle = define_c_proc(dll, name, args)

get machine level exceptions elsewhere (first call to dll as far as I can tell, vars = c_func(getglobalvars,{}) )

Andrea doesn't seem to have registered here, and its quite a useful little lib, so I was wondering if anyone had got it working, or if Andrea was still about.

Chris

new topic     » topic index » view message » categorize

2. Re: Andrea Cini's euwingui

ChrisB said...

Hi

Can't seem to get Andrea Cini's euwingui working with 4 - get a machine level exception with

handle = machine_func(51, {dll, name, args, 0})

Whoa. That's the first time I've ever seen that. Seriously, on the define_c call? Can you run under the watcom [windowed] debugger using a debug build of euphoria? I'll try to get around to doing this, but it may be a while before I get a chance.

Matt

new topic     » goto parent     » topic index » view message » categorize

3. Re: Andrea Cini's euwingui

ChrisB said...

Andrea doesn't seem to have registered here, and its quite a useful little lib, so I was wondering if anyone had got it working, or if Andrea was still about.

It looks like EuWinGui passes euphoria objects to its dll, the back end definition of which have changed. I think it will require the dll to be re-translated for 4.0.

Matt

new topic     » goto parent     » topic index » view message » categorize

4. Re: Andrea Cini's euwingui

mattlewis said...

It looks like EuWinGui passes euphoria objects to its dll, the back end definition of which have changed. I think it will require the dll to be re-translated for 4.0.

Or, I suppose it would be possible to write a shim that converted any returned values from the dll into 4.0 objects. Obviously, it would slow things down, but at least it should allow old code like that to work.

4.0 objects passed to 3.1 code should be fine (I think). But you'd need to convert anything coming from 3.1 code to be a 4.0 object.

Matt

new topic     » goto parent     » topic index » view message » categorize

5. Re: Andrea Cini's euwingui

mattlewis said...
mattlewis said...

It looks like EuWinGui passes euphoria objects to its dll, the back end definition of which have changed. I think it will require the dll to be re-translated for 4.0.

Or, I suppose it would be possible to write a shim that converted any returned values from the dll into 4.0 objects. Obviously, it would slow things down, but at least it should allow old code like that to work.

4.0 objects passed to 3.1 code should be fine (I think). But you'd need to convert anything coming from 3.1 code to be a 4.0 object.

Matt

Hi

Purely for curiosity's sake, please explain. How have they changed? How would you one write a shim that would convert? What would they convert - from / to? Has the internal structure / arrangement of the sequence changed from 3.x to 4?

Chris

new topic     » goto parent     » topic index » view message » categorize

6. Re: Andrea Cini's euwingui

ChrisB said...

Hi

Purely for curiosity's sake, please explain. How have they changed? How would you one write a shim that would convert? What would they convert - from / to? Has the internal structure / arrangement of the sequence changed from 3.x to 4?

Chris

The biggest change was the addition of the cleanup_ptr at the end of every structure (s1 [for sequences], d [for atoms], etc) used internally by euphoria to represent non-integer types. The code checks to see if this is NULL or not, and if not it attempts to interpret the value as an euphoria routine and calls it (runs the code of the routine). So if a 3.1 object was passed, we'd try to read pass the end of the memory for the structure. And then execute it. (But this particular issue is easy to deal with, a shim just needs add NULL to the end of the structure.)

new topic     » goto parent     » topic index » view message » categorize

7. Re: Andrea Cini's euwingui

Hello,

I am not sure if this can be of some help, but nevertheless ... 
 
This is the error message if I run e.g. Designer.exw with euiw.exe (r2972): 
 
d:\euphoria\euwingui\include\EuWinGUI.ew:272 in procedure ggv() 
A machine-level exception occurred during execution of this statement 
 
... called from d:\euphoria\euwingui\include\EuWinGUI.ew:305 in procedure Window() 
... called from D:\Euphoria\EuWinGui\EWG-Designer\Designer.exw:2407 in procedure WinMain() 
... called from D:\Euphoria\EuWinGui\EWG-Designer\Designer.exw:2627 
 
--> See ex.err 
 
Running Designer.exw with eu.ex I will get this message: 
 
D:\Euphoria\EuWinGui\EWG-Designer>eui c:\EUPHORIA\SOURCE\eu.ex Designer.exw 
 
c:\EUPHORIA\SOURCE\execute.e:1258 in procedure exit_block() 
A machine-level exception occurred during execution of this statement 
 
... called from c:\EUPHORIA\SOURCE\execute.e:1298 in procedure opRETURNP() 
... called from c:\EUPHORIA\SOURCE\execute.e:4110 in procedure do_exec() 
... called from c:\EUPHORIA\SOURCE\execute.e:4283 in procedure Execute() 
... called from c:\EUPHORIA\SOURCE\execute.e:4291 in procedure BackEnd() 
... called from c:\EUPHORIA\SOURCE\main.e:201 in procedure main() 
... called from c:\EUPHORIA\SOURCE\main.e:203 
 
--> See ex.err 
 
I tried to change the include statement in EuWinGui.ew to: include std/dll.e but then I get this error message: 
 
D:\Euphoria\EuWinGui\EWG-Designer>eui c:\EUPHORIA\SOURCE\eu.ex Designer.exw 
 
C:\EUPHORIA\include\std\dll.e:535 in function call_back() 
DEP style callbacks not supported in eu.ex 
... called from d:\euphoria\euwingui\include\EuWinGUI.ew:269 
 
--> see ex.err 

Roland

new topic     » goto parent     » topic index » view message » categorize

8. Re: Andrea Cini's euwingui

RStowasser said...

I tried to change the include statement in EuWinGui.ew to: include std/dll.e but then I get this error message:

D:\Euphoria\EuWinGui\EWG-Designer>eui c:\EUPHORIA\SOURCE\eu.ex Designer.exw 
 
C:\EUPHORIA\include\std\dll.e:535 in function call_back() 
DEP style callbacks not supported in eu.ex 
... called from d:\euphoria\euwingui\include\EuWinGUI.ew:269 
 
--> see ex.err 

Yes, when callbacks were made to work with DEP, for some reason the code to do so was written in the include file rather than the back end. I don't know why, but it should probably be considered a bug, and the code converted to C.

Due to the way that eu.ex handles callbacks, it doesn't work with windows callbacks any more. We need to get back to the state where the include file is a simple wrapper around the back end implementation.

Matt

new topic     » goto parent     » topic index » view message » categorize

9. Re: Andrea Cini's euwingui

mattlewis said...

Yes, when callbacks were made to work with DEP, for some reason the code to do so was written in the include file rather than the back end. I don't know why, but it should probably be considered a bug, and the code converted to C.

I just added this as ticket:111.

Matt

new topic     » goto parent     » topic index » view message » categorize

10. Re: Andrea Cini's euwingui

jimcbrown said...
ChrisB said...

Hi

Purely for curiosity's sake, please explain. How have they changed? How would you one write a shim that would convert? What would they convert - from / to? Has the internal structure / arrangement of the sequence changed from 3.x to 4?

Chris

The biggest change was the addition of the cleanup_ptr at the end of every structure (s1 [for sequences], d [for atoms], etc) used internally by euphoria to represent non-integer types. The code checks to see if this is NULL or not, and if not it attempts to interpret the value as an euphoria routine and calls it (runs the code of the routine). So if a 3.1 object was passed, we'd try to read pass the end of the memory for the structure. And then execute it. (But this particular issue is easy to deal with, a shim just needs add NULL to the end of the structure.)

It might not have been as easy as I thought. I wrote the following shim code, but EuWinGUI no longer crashes but doesn't seem to work either.

// libconvert.dll 
// tested with 4.0.0RC1's euphoria.h but this code is designed to work 
// with 3.1.1's euphoria.h as well 
#include <include/euphoria.h> 
 
#ifdef _WIN32 
#define DLLEXTERN extern __declspec(dllexport) 
#define DLLEXPORT __declspec(dllexport) 
// Use Heap functions for everything. 
void * ddefault_heap = NULL; 
#include <windows.h> 
#define hmalloc(n) HeapAlloc((void *)ddefault_heap, 0, n) 
#define hfree(p) HeapFree((void *)ddefault_heap, 0, p) 
#define hrealloc(p, n) HeapReAlloc((void *)ddefault_heap, 0, p, n) 
#else 
#define DLLEXTERN extern 
#define DLLEXPORT 
#define hmalloc(n) malloc(n) 
#define hfree(p) free(p) 
#define hrealloc(p, n) realloc(p, n) 
#endif 
 
DLLEXTERN void * atom_to_v3(void * param); 
DLLEXTERN void * atom_to_v4(void * param); 
DLLEXTERN void * sequence_to_v3(void * param); 
DLLEXTERN void * sequence_to_v4(void * param); 
DLLEXTERN void * object_to_v3(void * param); 
DLLEXTERN void * object_to_v4(void * param); 
 
struct s1v4 { 
	object_ptr base; 
	long length; 
	long ref; 
	long postfill; 
	void * cleanup; 
}; 
 
struct dv4 { 
	double dbl; 
	long ref; 
	void * cleanup; 
}; 
 
typedef struct dv4  *dv4_ptr; 
typedef struct s1v4 *s1v4_ptr; 
 
#define DBL_PTR4(ob) ( (dv4_ptr)  (((unsigned)(ob)) << 3) ) 
#define SEQ_PTR4(ob) ( (s1v4_ptr) (((unsigned)(ob)) << 3) )  
 
struct s1v3 { 
	object_ptr base; 
	long length; 
	long ref; 
	long postfill; 
}; 
 
struct dv3 { 
	double dbl; 
	long ref; 
}; 
 
typedef struct dv3  *dv3_ptr; 
typedef struct s1v3 *s1v3_ptr; 
 
#define DBL_PTR3(ob) ( (dv3_ptr)  (((unsigned)(ob)) << 3) ) 
#define SEQ_PTR3(ob) ( (s1v3_ptr) (((unsigned)(ob)) << 3) )  
 
void init() 
{ 
#ifdef _WIN32 
	if (ddefault_heap == NULL) 
		ddefault_heap = GetProcessHeap(); 
		//ddefault_heap = HeapCreate(0,0,0); 
#endif 
} 
 
DLLEXPORT void * atom_to_v3(void * param) 
{ 
	dv4_ptr d4; 
	dv3_ptr d3; 
	object atom = (object)param; 
	if (IS_ATOM_INT(atom) || atom == NOVALUE) 
	{ 
		return param; 
	} 
	if (!(IS_ATOM(atom))) 
	{ 
		return NULL; 
	} 
	init(); 
	d4 = DBL_PTR4(atom); 
	d3 = (dv3_ptr)hmalloc(sizeof(struct dv3)); 
	d3->dbl = d4->dbl; 
	d3->ref = 2; // not safe to free, so keep forever 
	//d4->ref--; 
	return (void *)(MAKE_DBL(d3)); 
} 
 
DLLEXPORT void * atom_to_v4(void * param) 
{ 
	dv4_ptr d4; 
	dv3_ptr d3; 
	object atom = (object)param; 
	if (IS_ATOM_INT(atom) || atom == NOVALUE) 
	{ 
		return param; 
	} 
	if (!(IS_ATOM(atom))) 
	{ 
		return NULL; 
	} 
	init(); 
	d3 = DBL_PTR3(atom); 
	d4 = (dv4_ptr)hmalloc(sizeof(struct dv4)); 
	d4->dbl = d3->dbl; 
	d4->ref = 2; // not safe to free, so keep forever 
	d4->cleanup = NULL; 
	//d3->ref--; 
	return (void *)(MAKE_DBL(d4)); 
} 
 
DLLEXPORT void * sequence_to_v3(void * param) 
{ 
	int i; 
	s1v4_ptr s4; 
	s1v3_ptr s3; 
	object atom = (object)param; 
	if (!(IS_SEQUENCE(atom))) 
	{ 
		return NULL; 
	} 
	init(); 
	s4 = SEQ_PTR4(atom); 
	s3 = (s1v3_ptr)hmalloc(sizeof(struct s1v3) + (s4->length + 1) * sizeof(object)); 
	s3->ref = 2; // not safe to free, so keep forever 
	s3->base = (object_ptr)(s3 + 1); 
	s3->base[s4->length] = NOVALUE; 
	for (i = 0; i < s4->length; i++) 
	{ 
		s3->base[i] = (object)object_to_v3((void*)(s4->base[i])); 
	} 
	s3->length = s4->length; 
	s3->postfill = s4->postfill; // is this right? 
	s3->base--; // point to "0th" element 
	//s4->ref--; 
	return (void *)(MAKE_SEQ(s3)); 
} 
 
DLLEXPORT void * sequence_to_v4(void * param) 
{ 
	int i; 
	s1v4_ptr s4; 
	s1v3_ptr s3; 
	object atom = (object)param; 
	if (!(IS_SEQUENCE(atom))) 
	{ 
		return NULL; 
	} 
	init(); 
	s3 = SEQ_PTR3(atom); 
	s4 = (s1v4_ptr)hmalloc(sizeof(struct s1v4) + (s3->length + 1) * sizeof(object)); 
	s4->ref = 2; // not safe to free, so keep forever 
	s4->base = (object_ptr)(s4 + 1); 
	s4->base[s3->length] = NOVALUE; 
	for (i = 0; i < s3->length; i++) 
	{ 
		s4->base[i] = (object)object_to_v4((void*)(s3->base[i])); 
	} 
	s4->length = s3->length; 
	s4->postfill = s3->postfill; // is this right? 
	s4->cleanup = NULL; 
	s4->base--; // point to "0th" element 
	//s3->ref--; 
	return (void *)(MAKE_SEQ(s4)); 
} 
 
DLLEXPORT void * object_to_v3(void * param) 
{ 
	object atom = (object)param; 
	if (IS_ATOM_INT(atom) || atom == NOVALUE) 
	{ 
		return param; 
	} 
	if (IS_SEQUENCE(atom)) 
	{ 
		return sequence_to_v3(param); 
	} 
	return atom_to_v3(param); 
} 
 
DLLEXPORT void * object_to_v4(void * param) 
{ 
	object atom = (object)param; 
	if (IS_ATOM_INT(atom) || atom == NOVALUE) 
	{ 
		return param; 
	} 
	if (IS_SEQUENCE(atom)) 
	{ 
		return sequence_to_v4(param); 
	} 
	return atom_to_v4(param); 
} 

Here are the required changes to EuWinGUI.ew

AM = C_POINTER, 
SQ = C_POINTER 
--AM = E_ATOM, 
--SQ = E_SEQUENCE 
 
atom object_to_v3, object_to_v4, v3helper 
 
function v3_c_func(atom x, sequence p) 
	object ret, r, q 
	q = "" 
	for i = 1 to length(p) do 
		q &= 0 
		q[i] = c_func(object_to_v3, {p[i]}) 
	end for 
	ret = c_func(x, q) 
	r = c_func(object_to_v4, {ret}) 
	return r 
end function 
procedure v3_c_proc(atom x, sequence p) 
	object q 
	q = "" 
	for i = 1 to length(p) do 
		q &= 0 
		q[i] = c_func(object_to_v3, {p[i]}) 
	end for 
	c_proc(x, q) 
end procedure 
                   
procedure link() 
v3helper = indll("LIBCONVERT.DLL") 
object_to_v3 = infunc(v3helper,"object_to_v3",{E_OBJECT},C_POINTER) 
object_to_v4 = infunc(v3helper,"object_to_v4",{C_POINTER},E_OBJECT) 
EWG = indll("EuWinGUI.DLL") 
new topic     » goto parent     » topic index » view message » categorize

11. Re: Andrea Cini's euwingui

jimcbrown said...
jimcbrown said...
ChrisB said...

Hi

Purely for curiosity's sake, please explain. How have they changed? How would you one write a shim that would convert? What would they convert - from / to? Has the internal structure / arrangement of the sequence changed from 3.x to 4?

Chris

The biggest change was the addition of the cleanup_ptr at the end of every structure (s1 [for sequences], d [for atoms], etc) used internally by euphoria to represent non-integer types. The code checks to see if this is NULL or not, and if not it attempts to interpret the value as an euphoria routine and calls it (runs the code of the routine). So if a 3.1 object was passed, we'd try to read pass the end of the memory for the structure. And then execute it. (But this particular issue is easy to deal with, a shim just needs add NULL to the end of the structure.)

It might not have been as easy as I thought. I wrote the following shim code, but EuWinGUI no longer crashes but doesn't seem to work either.

I realized that it was possible to write the shim layer in 100% Eu instead of in C. This was significantly easier to get working, and wokred out of the box on the first try.

You can get it at http://malcom.unkmar.com/lostsouls/euconvert.zip - euconvert.dll and euconvertinc.e are what you want.

euconvert.e is the source of euconvert.dll, and I also left the watcom build artifacts in (just in case someone needs to rebuild with a different version of watcom or wants to hack the C layer for some reason).

Here are the required changes to EuWinGUI.ew

integer spa,closeapp,waitevent,window,control,infomsg,warnmsg,askmsg,setpos,setdim,settext,setcheck, 
ischecked,loadpic,setico,gettext,setenable,setvisible,listclear,listadd,listdel,listins,listseek, 
getitem,getcount,getindex,listput,filedlg,activate,activatetext,setrefresh,setwintimer,seticon, 
runapp,screenwidth,screenheight,setparentwindow,setfixedfont,setdrawingproc,deleteimage,setlistcwidth, 
setrepainton,getlistitemheight,listindex,listcount,setcur,setdrawingcontrol,drawline,drawpoint, 
drawstring,drawpolygon,setpencolor,setpensize,playsnd,stopsnd,drawmultiline,trapmessage,loadcur,setpicture, 
message,gettrappedmessage,setpic,loadico,getstringsize,newfont,setfont,setdrawingfont,getglobalvars, 
setglobalvars,newmb,setdrawingmb,copymb,copymbtocontrol,getpixelcolor,seteditsel,geteditsel,iskeypressed, 
processevent,iseventwaiting,setcolor,selectprinter,getpagesize,getprinterstringsize,setprinterpencolor, 
setprinterfont,printmb,printstring,newdocument,newpage,startprinting,getselec,setexpp 
 
-- INSERT THIS LINE -- 
include euconvertinc.e 
-- END OF INSERT -- 
 
procedure infail(sequence name) 
integer k 
puts(1, "The EuWinGUI Library\n") 
puts(1, "(C)2001-2006 by Andrea Cini.\n\n") 
puts(1, "ERROR: Unable to initialize " & name & "!\n\nPress any key to abort...\n") 
while 1 do 
k = get_key() 
if k != -1 then 
abort(1) 
end if 
end while 
end procedure	  
function indll(sequence file_name) 
atom res 
res = machine_func(50, file_name) 
if res = NULL then infail(file_name) end if 
return res 
end function 
function infunc(atom dll, sequence name, sequence args, atom result) 
integer handle 
-- INSERT THIS -- 
--handle = machine_func(51, {dll, name, args, result}) 
handle = v3_define_c_func(dll, name, args, result) 
-- END OF INSERT -- 
if handle = -1 then 
infail(name) 
else 
return handle 
end if 
end function 
function inproc(atom dll, sequence name, sequence args) 
integer handle 
-- INSERT THIS -- 
--handle = machine_func(51, {dll, name, args, 0}) 
handle = v3_define_c_proc(dll, name, args) 
-- END OF INSERT -- 
if handle = -1 then 
infail(name) 
else 
return handle 
end if 
end function 
new topic     » goto parent     » topic index » view message » categorize

12. Re: Andrea Cini's euwingui

Hi

getting an error (any app / demo)

C:\EUPHORIA\INCLUDE\EuWinGUI.ew:283 
c_proc/c_func: bad routine number (88)  

line 283 is

function execpp(object rid) 
call_proc(rid,{}) 
return 0 
end function 
c_proc(setexpp,{call_back(routine_id("execpp"))})                      <<<<line 283 
 

Chris

new topic     » goto parent     » topic index » view message » categorize

13. Re: Andrea Cini's euwingui

ChrisB said...

Hi

getting an error (any app / demo)

C:\EUPHORIA\INCLUDE\EuWinGUI.ew:283 
c_proc/c_func: bad routine number (88)  

line 283 is

function execpp(object rid) 
call_proc(rid,{}) 
return 0 
end function 
c_proc(setexpp,{call_back(routine_id("execpp"))})                      <<<<line 283 
 

Chris

I don't know. Maybe try changing c_proc on that line to v3_c_proc ?

new topic     » goto parent     » topic index » view message » categorize

14. Re: Andrea Cini's euwingui

ChrisB said...

Hi

getting an error (any app / demo)

C:\EUPHORIA\INCLUDE\EuWinGUI.ew:283 
c_proc/c_func: bad routine number (88)  

line 283 is

function execpp(object rid) 
call_proc(rid,{}) 
return 0 
end function 
c_proc(setexpp,{call_back(routine_id("execpp"))})                      <<<<line 283 
 

Chris

I see what happened. I forgot to mention that you have to manually edit EuWinGUI.ew and replace all c_proc/c_func calls with v3_c_proc/v3_c_func (which goes through the v311 shim compatibility layer).

new topic     » goto parent     » topic index » view message » categorize

15. Re: Andrea Cini's euwingui

Hi

Yes, that's it - the return of one of the great tools.

Thanks Jim

Chris

new topic     » goto parent     » topic index » view message » categorize

16. Re: Andrea Cini's euwingui

ChrisB said...

Hi

Yes, that's it - the return of one of the great tools.

Thanks Jim

Chris

There's a bug in the wrapper. The return values of v3_c_func() are passed in from a memory block allocated by 3.1.1 code, but after this is turned back into a 4.0 object, the block of RAM is never freed.

I can't compile a new dll.e right now, but here's the new euconvert.e and euconvertinc.e needed to fix this.

euconvertinc.e

include std/dll.e 
include std/machine.e 
include std/text.e 
include std/get.e 
 
constant thedll = open_dll("euconvert.dll"), 
v3_define_c_func_ = define_c_func(thedll, "v3_define_c_func", {C_POINTER}, C_INT), 
v3_define_c_proc_ = define_c_func(thedll, "v3_define_c_proc", {C_POINTER}, C_INT), 
v3_c_func_ = define_c_func(thedll, "v3_c_func", {C_INT, C_POINTER}, C_POINTER), 
v3_c_proc_ = define_c_proc(thedll, "v3_c_proc", {C_INT, C_POINTER}) 
v3_free_ = define_c_proc(thedll, "v3_free", {C_POINTER}) 
 
if find(-1, {thedll, v3_define_c_func_, v3_define_c_proc_, v3_c_func_, v3_c_proc_} ) then 
	puts(1, "thedll, v3_define_c_func_, v3_define_c_proc_, v3_c_func_, v3_c_proc_\n") 
	? {thedll, v3_define_c_func_, v3_define_c_proc_, v3_c_func_, v3_c_proc_} 
	puts(1, "error opening one of the above\n") 
	abort(1) 
end if 
 
public function v3_define_c_func(atom dll, sequence name, sequence args, atom ret) 
	sequence all = {dll, name, args, ret} 
	all = sprint(all) 
	atom addr = allocate_string(all) 
	integer r = c_func(v3_define_c_func_, {addr}) 
	free(addr) 
	return r 
end function 
 
public function v3_define_c_proc(atom dll, sequence name, sequence args) 
	sequence all = {dll, name, args} 
	all = sprint(all) 
	atom addr = allocate_string(all) 
	integer r = c_func(v3_define_c_proc_, {addr}) 
	free(addr) 
	return r 
end function 
 
public function v3_c_func(integer func, sequence args) 
	sequence all = sprint(args) 
	atom addr = allocate_string(all) 
	atom ret = c_func(v3_c_func_, {func, addr}) 
	free(addr) 
	all = peek_string(ret) 
	-- since this was allocated by a v3 runtime, we need to make sure 
	-- that it is freed by the same runtime that did the allocation 
	c_proc(v3_free_, {ret}) 
	all = value(all) 
	return all[2] 
end function 
 
public procedure v3_c_proc(integer func, sequence args) 
	sequence all = sprint(args) 
	atom addr = allocate_string(all) 
	c_proc(v3_c_proc_, {func, addr}) 
	free(addr) 
end procedure 

euconvert.e

include dll.e 
include get.e 
include misc.e 
include machine.e 
 
function peek_string(atom addr) 
        sequence s 
        integer c 
        s = "" 
        while 1 do 
                c = peek(addr) 
                if c = 0 then 
                        exit 
                end if 
                s &= c 
		addr = addr + 1 
        end while 
        return s 
end function 
 
function toobject(sequence s) 
        if atom(s) then 
                s = peek_string(s) 
        end if 
        s = value(s) 
        if atom(s[2]) then 
                s = "" 
        else 
                s = s[2] 
        end if 
        return s 
end function 
 
global function v3_define_c_proc(integer x) 
	sequence s 
        s = toobject(x) 
        return define_c_proc(s[1], s[2], s[3]) 
end function 
 
global function v3_define_c_func(integer x) 
	sequence s 
        s = toobject(x) 
        return define_c_func(s[1], s[2], s[3], s[4]) 
end function 
 
global function v3_c_func(integer i, integer x) 
	sequence s 
        s = toobject(x) 
        i = allocate_string(sprint(c_func(i, s))) 
	return i 
end function 
 
global procedure v3_c_proc(integer i, integer x) 
	sequence s 
        s = toobject(x) 
        c_proc(i, s) 
end procedure 
 
global procedure v3_free(integer x) 
	free(x) 
end procedure 
new topic     » goto parent     » topic index » view message » categorize

17. Re: Andrea Cini's euwingui

Hi

I tried compiling euconvert.e by

euc -dll euconvert.e

(having set the environment variables for Watcom and so on), it seemed to compile ok, but I don't seem to have a functioning dll. Just to check, could you compile it for me, I'll see if that works, and do I need to be doing anything special to compile it?

Chris

new topic     » goto parent     » topic index » view message » categorize

18. Re: Andrea Cini's euwingui

ChrisB said...

Hi

I tried compiling euconvert.e by

euc -dll euconvert.e

(having set the environment variables for Watcom and so on), it seemed to compile ok, but I don't seem to have a functioning dll. Just to check, could you compile it for me, I'll see if that works, and do I need to be doing anything special to compile it?

Chris

The version with the fix (including translated artifacts and a fully compiled .dll) is up at http://openeuphoria.org/euconvert.zip

new topic     » goto parent     » topic index » view message » categorize

19. Re: Andrea Cini's euwingui

Hi

Yes, that's working fine now.

Incidentally, any ideas why my compile didn't work? euc works fine compiling other programs.

Chris

new topic     » goto parent     » topic index » view message » categorize

20. Re: Andrea Cini's euwingui

ChrisB said...

Hi

Yes, that's working fine now.

Incidentally, any ideas why my compile didn't work? euc works fine compiling other programs.

Chris

Can you send me the dll you built?

new topic     » goto parent     » topic index » view message » categorize

21. Re: Andrea Cini's euwingui

Hi

box.net is playing up - email me your email address crylex at gmail dot com

Changed mind - get it here

http://rapidshare.com/files/430912778/euconvert.zip

Chris

new topic     » goto parent     » topic index » view message » categorize

22. Re: Andrea Cini's euwingui

ChrisB said...

Hi

box.net is playing up - email me your email address crylex at gmail dot com

Changed mind - get it here

http://rapidshare.com/files/430912778/euconvert.zip

Chris

I thought I had replied to this earlier, but it seems not.

Anyways, it's hard to say for sure, but my best guess is that you built the converter dll with 4.0 instead of 3.1.1. In order to work properly, the converter dll must be built with 3.1.1 - otherwise, you get the same issues with struct changes that you would with using 4.0 directly to pass the data in (since that's exactly what a 4.0-built converter dll would be doing).

I considered a C-shim layer (which would get rid of the dependency on 3.1.1) but it was just easier and faster to do stuff with Eu.

new topic     » goto parent     » topic index » view message » categorize

23. Re: Andrea Cini's euwingui

Hi

My word, thats an old topic! I've been using euwingui without a second thought for a long while now.

Thanks again for the dll.

Chris

new topic     » goto parent     » topic index » view message » categorize

24. Re: Andrea Cini's euwingui

ChrisB said...

Hi

My word, thats an old topic! I've been using euwingui without a second thought for a long while now.

Thanks again for the dll.

Chris

No problem. Glad to have been of service. My apologies for taking so long to post a reply.

new topic     » goto parent     » topic index » view message » categorize

Search



Quick Links

User menu

Not signed in.

Misc Menu