Hi!
I started using wine (wine-20020122 compiled from source tarball) a couple of weeks ago to run a store-point-of-sale application. The idea is to port this windows application to linux. Before porting, we decided to check if the app could be emulated on linux with wine or recompiled with winelib.
This is also necessary to run proprietary windows DLLs from third parties such as credit card companies that bind the application to specific hardware.
The software uses a lot of external hardware such as printers, barcode scanners, special keyboards etc.
These hws usually communicate through the serial port.
Another important feature of the software is the use of DDE - Dynamic Data Exchange from the windows API. The application is broken into at least two executables that communicate through DDE.
The http://www.winehq.com/News/status.html states that the implementation of the serial/parallel port is 90% complete but that DDE is still being implemented by Eric Pouech and not functional.
After reviewing the manuals and spending a few days on trial runs, I decided to try and bring in the native DDEML.DLL and see if the exe´s would communicate.
QUESTION: Should this native windows library work under wine, has anybody tried this?
When I tried running the software with the native DDE engine (from Win98), I get DDE errors and a warning saying that DDE is not functional yet. This is expected as reported by the status.html page.
When I tried running the software with a setup that only the DDEML.DLL was native, the program crashed with an exception. I tried running the program with several debug channels but couldn´t detect the problem. The only thing learned was that the program seemed to be crashing inside USER.DLL builtin code. I then tried several different native/builtin setups using mainly the following DLLs: Native DLLs DDEML.DLL OLE32.DLL COMCTL*.DLL COMDLG*.DLL SHELL.DLL SHELL32.DLL
I even tried bringing in USER and USER32.
Some of these setups were documented not to work and didn´t. Everytime I got a setup that seemed to work, the software would crash with basically an exception or page fault.
I then decided to use winedbg.
I was able to get a stack trace of the software at the time of the exception. It is at the end of this email.
I also put a complete run of winedbg --debugmsg +msg 'c:\sw\store.exe'
in http://admin.vmn.com.br/wine/out.txt
From the trace it seemed that USER builtin in code was not yet finished and handling correctly DDE messages or had a messaging bug related to DDE or not. I read the functions in c code from the trace and couldn´t see any obvious problems. They seemed complete and finished.
QUESTION: Is the builtin USER.DLL complete? QUESTION: Should it interact correctly with DDEML.DLL? If DDEML.DLL and USER.DLL were communicating through COM then they should interact correctly but since DDE is a protocol dating back to win3.1, probably older than OLE and COM, maybe they don´t.
I have thought of reworking the original software to use SOCKETS but this is quite a lot of work.
I am new to wine so I may be missing something obvious.
Thanks in advance for any help.
Miguel Feitosa
TRACE
First chance exception: page fault on read access to 0xc032090d in 32-bit code (0x400a47d6). In 32-bit mode. Register dump: CS:0023 SS:002b DS:002b ES:002b FS:0277 GS:0000 EIP:400a47d6 ESP:40ca69ac EBP:40ca69b0 EFLAGS:00010202( R- 00 I - - 1 ) EAX:c032090f EBX:40100ef8 ECX:000003e7 EDX:c032090d ESI:c032090f EDI:40ca6a10 Stack dump: 0x40ca69ac (_end+0x237d58): 406c1c84 40ca69c8 406266c6 c032090f 0x40ca69bc (_end+0x237d68): 406c1c84 080745a8 40ca6b70 40ca6a84 0x40ca69cc (_end+0x237d78): 4062f205 000003e7 c032090f 40ca6a10 0x40ca69dc (_end+0x237d88): 40ca6a14 406c1c84 080745a8 40ca6b70 0x40ca69ec (_end+0x237d98): 00000000 00000000 00000000 406911ae 0x40ca69fc (_end+0x237da8): 406c1c84 00010021 00000000 00000000 0x40ca6a0c (_end+0x237db8):
004e: sel=0277 base=40cb7000 limit=00000fff 32-bit rw- Backtrace: =>0 0x400a47d6 (GlobalLock+0x1a(hmem=0xc032090f) [global.c:1090] in libntdll.so) (ebp=40ca69b0) 1 0x406266c6 (UnpackDDElParam+0x46(msg=0x3e7, lParam=0xc032090f, uiLo=0x40ca6a10, uiHi=0x40ca6a14) [misc.c:130] in libuser32.so) (ebp=40ca69c8) 2 0x4062f205 (post_dde_message+0x35(dest_tid=0x80745a8, data=0x40ca6b2c, info=0x40ca6b70, data=0x40ca6b2c, data=0x40ca6b2c, data=0x40ca6b2c) [message.c:1142] in libuser32.so) (ebp=40ca6a84) 3 0x4062ff94 (put_message_in_queue+0xc8(dest_tid=0x80745a8, info=0x40ca6b70, reply_size=0x0) [message.c:1587] in libuser32.so) (ebp=40ca6b50) 4 0x40630b0e (PostMessageW+0xba(hwnd=0x10029, msg=0x3e7, wparam=0x27, lparam=0xc032090f) [message.c:1995] in libuser32.so) (ebp=40ca6b94) 5 0x4063173a (PostMessage16+0x66(hwnd16=0x29, msg=0x3e7, wparam=0x27, lparam=0xc032090f) [msg16.c:89] in libuser32.so) (ebp=40ca6bc4) 6 0x4061f4e9 (USER_CallFrom16_p_word_wwwl+0x29(proc=0x406316d4, args=0x403b613e) [user.spec.c:1052] in libuser32.so) (ebp=40ca6be0) 7 0x4008f14a (__wine_call_from_16_word+0x8e [relay16.s] in libntdll.so) (ebp=40ca6c10) 8 0x03af:0x5a71 (bp=a5ae) 9 0x03af:0x38e8 (bp=a5cc) 10 0x03af:0x3617 (bp=a5f0) 11 0x03af:0x150a (bp=a618) 12 0x033f:0x1dec (bp=a640, far call assumed) 13 0x033f:0x1f1f (bp=a668) 14 0x028f:0x0c86 (bp=a904) 15 0x0287:0x00e0 (bp=0000)
0x400a47d6 (GlobalLock+0x1a [global.c:1090] in libntdll.so): cmpw $0x5342,0xfffffffe(%eax) 1090 if(pintern->Magic==MAGIC_GLOBAL_USED) Wine-dbg>First chance exception: page fault on read access to 0xc032090d in 32-bit code (0x400a47d6). Register dump: CS:0023 SS:002b DS:002b ES:002b FS:0277 GS:0000 EIP:400a47d6 ESP:40ca69ac EBP:40ca69b0 EFLAGS:00010202( R- 00 I - - 1 ) EAX:c032090f EBX:40100ef8 ECX:000003e7 EDX:c032090d ESI:c032090f EDI:40ca6a10 Stack dump: 0x40ca69ac (_end+0x237d58): 406c1c84 40ca69c8 406266c6 c032090f 0x40ca69bc (_end+0x237d68): 406c1c84 080745a8 40ca6b70 40ca6a84 0x40ca69cc (_end+0x237d78): 4062f205 000003e7 c032090f 40ca6a10 0x40ca69dc (_end+0x237d88): 40ca6a14 406c1c84 080745a8 40ca6b70 0x40ca69ec (_end+0x237d98): 00000000 00000000 00000000 406911ae 0x40ca69fc (_end+0x237da8): 406c1c84 00010021 00000000 00000000 0x40ca6a0c (_end+0x237db8):
004e: sel=0277 base=40cb7000 limit=00000fff 32-bit rw- Backtrace: =>0 0x400a47d6 (GlobalLock+0x1a(hmem=0xc032090f) [global.c:1090] in libntdll.so) (ebp=40ca69b0) 1 0x406266c6 (UnpackDDElParam+0x46(msg=0x3e7, lParam=0xc032090f, uiLo=0x40ca6a10, uiHi=0x40ca6a14) [misc.c:130] in libuser32.so) (ebp=40ca69c8) 2 0x4062f205 (post_dde_message+0x35(dest_tid=0x80745a8, data=0x40ca6b2c, info=0x40ca6b70, data=0x40ca6b2c, data=0x40ca6b2c, data=0x40ca6b2c) [message.c:1142] in libuser32.so) (ebp=40ca6a84) 3 0x4062ff94 (put_message_in_queue+0xc8(dest_tid=0x80745a8, info=0x40ca6b70, reply_size=0x0) [message.c:1587] in libuser32.so) (ebp=40ca6b50) 4 0x40630b0e (PostMessageW+0xba(hwnd=0x10029, msg=0x3e7, wparam=0x27, lparam=0xc032090f) [message.c:1995] in libuser32.so) (ebp=40ca6b94) 5 0x4063173a (PostMessage16+0x66(hwnd16=0x29, msg=0x3e7, wparam=0x27, lparam=0xc032090f) [msg16.c:89] in libuser32.so) (ebp=40ca6bc4) 6 0x4061f4e9 (USER_CallFrom16_p_word_wwwl+0x29(proc=0x406316d4, args=0x403b613e) [user.spec.c:1052] in libuser32.so) (ebp=40ca6be0) 7 0x4008f14a (__wine_call_from_16_word+0x8e [relay16.s] in libntdll.so) (ebp=40ca6c10) 8 0x03af:0x5a71 (bp=a5ae) 9 0x03af:0x38e8 (bp=a5cc) 10 0x03af:0x3617 (bp=a5f0) 11 0x03af:0x150a (bp=a618) 12 0x033f:0x1dec (bp=a640, far call assumed) 13 0x033f:0x1f1f (bp=a668) 14 0x028f:0x0c86 (bp=a904) 15 0x0287:0x00e0 (bp=0000)
0x400a47d6 (GlobalLock+0x1a [global.c:1090] in libntdll.so): cmpw $0x5342,0xfffffffe(%eax) 1090 if(pintern->Magic==MAGIC_GLOBAL_USED) Wine-dbg>First chance exception: page fault on read access to 0xc032090d in 32-bit code (0x400a47d6). Register dump: CS:0023 SS:002b DS:002b ES:002b FS:0277 GS:0000 EIP:400a47d6 ESP:40ca69ac EBP:40ca69b0 EFLAGS:00010202( R- 00 I - - 1 ) EAX:c032090f EBX:40100ef8 ECX:000003e7 EDX:c032090d ESI:c032090f EDI:40ca6a10 Stack dump: 0x40ca69ac (_end+0x237d58): 406c1c84 40ca69c8 406266c6 c032090f 0x40ca69bc (_end+0x237d68): 406c1c84 080745a8 40ca6b70 40ca6a84 0x40ca69cc (_end+0x237d78): 4062f205 000003e7 c032090f 40ca6a10 0x40ca69dc (_end+0x237d88): 40ca6a14 406c1c84 080745a8 40ca6b70 0x40ca69ec (_end+0x237d98): 00000000 00000000 00000000 406911ae 0x40ca69fc (_end+0x237da8): 406c1c84 00010021 00000000 00000000 0x40ca6a0c (_end+0x237db8):
004e: sel=0277 base=40cb7000 limit=00000fff 32-bit rw- Backtrace: =>0 0x400a47d6 (GlobalLock+0x1a(hmem=0xc032090f) [global.c:1090] in libntdll.so) (ebp=40ca69b0) 1 0x406266c6 (UnpackDDElParam+0x46(msg=0x3e7, lParam=0xc032090f, uiLo=0x40ca6a10, uiHi=0x40ca6a14) [misc.c:130] in libuser32.so) (ebp=40ca69c8) 2 0x4062f205 (post_dde_message+0x35(dest_tid=0x80745a8, data=0x40ca6b2c, info=0x40ca6b70, data=0x40ca6b2c, data=0x40ca6b2c, data=0x40ca6b2c) [message.c:1142] in libuser32.so) (ebp=40ca6a84) 3 0x4062ff94 (put_message_in_queue+0xc8(dest_tid=0x80745a8, info=0x40ca6b70, reply_size=0x0) [message.c:1587] in libuser32.so) (ebp=40ca6b50) 4 0x40630b0e (PostMessageW+0xba(hwnd=0x10029, msg=0x3e7, wparam=0x27, lparam=0xc032090f) [message.c:1995] in libuser32.so) (ebp=40ca6b94) 5 0x4063173a (PostMessage16+0x66(hwnd16=0x29, msg=0x3e7, wparam=0x27, lparam=0xc032090f) [msg16.c:89] in libuser32.so) (ebp=40ca6bc4) 6 0x4061f4e9 (USER_CallFrom16_p_word_wwwl+0x29(proc=0x406316d4, args=0x403b613e) [user.spec.c:1052] in libuser32.so) (ebp=40ca6be0) 7 0x4008f14a (__wine_call_from_16_word+0x8e [relay16.s] in libntdll.so) (ebp=40ca6c10) 8 0x03af:0x5a71 (bp=a5ae) 9 0x03af:0x38e8 (bp=a5cc) 10 0x03af:0x3617 (bp=a5f0) 11 0x03af:0x150a (bp=a618) 12 0x033f:0x1dec (bp=a640, far call assumed) 13 0x033f:0x1f1f (bp=a668) 14 0x028f:0x0c86 (bp=a904) 15 0x0287:0x00e0 (bp=0000)
0x400a47d6 (GlobalLock+0x1a [global.c:1090] in libntdll.so): cmpw $0x5342,0xfffffffe(%eax) 1090 if(pintern->Magic==MAGIC_GLOBAL_USED) Wine-dbg>130 params = GlobalLock(hMem); Wine-dbg>1142 if (!UnpackDDElParam( info->msg, info->lparam, &uiLo, &uiHi )) Wine-dbg>1587 return post_dde_message( dest_tid, &data, info ); Wine-dbg>1995 return put_message_in_queue( dest_tid, &info, NULL ); Wine-dbg>89 return PostMessageW( hwnd, msg32, wparam32, lparam ); Wine-dbg>1052 return proc( Wine-dbg>
The http://www.winehq.com/News/status.html states that the implementation of the serial/parallel port is 90% complete but that DDE is still being implemented by Eric Pouech and not functional.
the status page is now a bit outdated DDE (and DDEML) now kinda work however, some 16 bit support is still missing in DDE (and DDEML), hence your problems as the trace shows as of today : - two 32 bit apps should be able to communicate through DDE - two 16 bit apps should be able to communicate through DDE - however, a 16 bit and a 32 bit app will not be able to communicate
I have a yet unfinished patch here that should (partly) take care of that if you have the wine source and are ready to do some testing, I can provide you the patch to see if it helps in your situation
as DDEML is a pure 16 bit DLL (the 32 bit DDEML implementation is part of USER32), it's very unlikely that native DDEML will work in wine so, sticking to builtin USER/USER32/DDEML is the only viable solution (even if it's not completly done yet)
A+