1. Andrea Cini's euwingui
- Posted by ChrisB (moderator) Oct 27, 2009
- 4614 views
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
2. Re: Andrea Cini's euwingui
- Posted by mattlewis (admin) Oct 27, 2009
- 4557 views
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
3. Re: Andrea Cini's euwingui
- Posted by mattlewis (admin) Oct 28, 2009
- 4519 views
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
4. Re: Andrea Cini's euwingui
- Posted by mattlewis (admin) Oct 28, 2009
- 4556 views
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
5. Re: Andrea Cini's euwingui
- Posted by ChrisB (moderator) Oct 28, 2009
- 4482 views
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
6. Re: Andrea Cini's euwingui
- Posted by jimcbrown (admin) Oct 28, 2009
- 4489 views
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.)
7. Re: Andrea Cini's euwingui
- Posted by RStowasser Oct 29, 2009
- 4447 views
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
8. Re: Andrea Cini's euwingui
- Posted by mattlewis (admin) Oct 29, 2009
- 4440 views
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
9. Re: Andrea Cini's euwingui
- Posted by mattlewis (admin) Oct 29, 2009
- 4396 views
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
10. Re: Andrea Cini's euwingui
- Posted by jimcbrown (admin) Nov 11, 2010
- 4230 views
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")
11. Re: Andrea Cini's euwingui
- Posted by jimcbrown (admin) Nov 12, 2010
- 4268 views
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
12. Re: Andrea Cini's euwingui
- Posted by ChrisB (moderator) Nov 12, 2010
- 4034 views
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
13. Re: Andrea Cini's euwingui
- Posted by jimcbrown (admin) Nov 12, 2010
- 3982 views
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 ?
14. Re: Andrea Cini's euwingui
- Posted by jimcbrown (admin) Nov 12, 2010
- 3982 views
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).
15. Re: Andrea Cini's euwingui
- Posted by ChrisB (moderator) Nov 13, 2010
- 3976 views
Hi
Yes, that's it - the return of one of the great tools.
Thanks Jim
Chris
16. Re: Andrea Cini's euwingui
- Posted by jimcbrown (admin) Nov 13, 2010
- 3927 views
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
17. Re: Andrea Cini's euwingui
- Posted by ChrisB (moderator) Nov 13, 2010
- 3905 views
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
18. Re: Andrea Cini's euwingui
- Posted by jimcbrown (admin) Nov 14, 2010
- 3769 views
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
19. Re: Andrea Cini's euwingui
- Posted by ChrisB (moderator) Nov 14, 2010
- 3757 views
Hi
Yes, that's working fine now.
Incidentally, any ideas why my compile didn't work? euc works fine compiling other programs.
Chris
20. Re: Andrea Cini's euwingui
- Posted by jimcbrown (admin) Nov 14, 2010
- 3744 views
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?
21. Re: Andrea Cini's euwingui
- Posted by ChrisB (moderator) Nov 14, 2010
- 3821 views
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
22. Re: Andrea Cini's euwingui
- Posted by jimcbrown (admin) Aug 30, 2013
- 2537 views
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.
23. Re: Andrea Cini's euwingui
- Posted by ChrisB (moderator) Aug 30, 2013
- 2489 views
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
24. Re: Andrea Cini's euwingui
- Posted by jimcbrown (admin) Aug 30, 2013
- 2483 views
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.