Hi,
Below is the initialisation code of PDV.EXE (a), the app that calls DISP.EXE and thens set's up DDE. Both are 16bit. I have added some comments to try and clarify the code. I have also added the output of wine --debugmsg +dll,+shell,+ddeml PDV.EXE (b).
Yesterday, I ran winedbg and set a breakpoint on DDeConnect. A backtrace from the function is below (c). The step through the function showed that
HCONV WINAPI DdeConnect(DWORD idInst, HSZ hszService, HSZ hszTopic, LPCONVCONTEXT pCC) .... if (pInstance->unicode) /*This is false so CreateWindowA gets called */ .... pConv = WDML_GetConvFromWnd(hwndClient); /* winedbg> print pConv 0x00000000 Seems pConv is null */ if (pConv == NULL || pConv->hwndServer == 0) { /* Flow goes here and execution stops */ ...
Thanks, Miguel
(a) Code from PDV.EXE
void CALLBACK _export InitDisplay(HWND hWnd) {
/* Call DISP.EXE */ if (ShellExecute(hWnd, "open", PDVROT_szDisplay, "", PDVROT_szPDVPath, SW_SHOWNORMAL) <= (HINSTANCE) 32) { HandleOutput("ERROR: DISPLAY PDV."); return; } WaitAppActivate(DISPLAYTITLE); if (DdeInitialize((LPDWORD) & idInst, (PFNCALLBACK) DDECallback, APPCMD_CLIENTONLY, 0L)) { HandleOutput("ERROR failed to init DDE DISPLAY PDV."); return; } hszService = DdeCreateStringHandle(idInst, DISPLAYTITLE, CP_WINANSI); hszTopic = DdeCreateStringHandle(idInst, "Form1", CP_WINANSI); hszItem = DdeCreateStringHandle(idInst, "label1", CP_WINANSI);
/* Connect with DDE server (DISPLAY) */
hConv = DdeConnect(idInst, hszService, hszTopic, (PCONVCONTEXT) NULL); if (hConv == NULL) { HandleError(DdeGetLastError(idInst)); HandleOutput("ERROR could not connect DISPLAY."); /* Control goes here and the App fails with the above message This code is written with Borland C++^M */ }
(b) wine --debugmsg +dll,+shell,+ddeml PDV.EXE
Could not stat /mnt/fd0 (No such file or directory), ignoring drive A: Could not stat /cdrom (No such file or directory), ignoring drive D: trace:dll:fill_init_list (KRNL386.EXE) - START trace:dll:fill_init_list (KRNL386.EXE) - END trace:dll:fill_init_list (system.dll) - START trace:dll:fill_init_list (system.dll) - END trace:dll:fill_init_list (wprocs.dll) - START trace:dll:fill_init_list (wprocs.dll) - END trace:dll:fill_init_list (GDI.EXE) - START trace:dll:fill_init_list (GDI.EXE) - END trace:dll:fill_init_list (USER.EXE) - START trace:dll:fill_init_list (USER.EXE) - END trace:dll:fill_init_list (display.dll) - START trace:dll:fill_init_list (display.dll) - END fixme:keyboard:X11DRV_KEYBOARD_DetectLayout Your keyboard layout was not found! Using closest match instead (Brazilian ABNT-2 keyboard layout) for scancode mapping. Please define your layout in windows/x11drv/keyboard.c and submit them to us for inclusion into future Wine releases. See the Wine User Guide, chapter "Keyboard" for more information. trace:dll:fill_init_list (mmsystem.dll) - START trace:dll:fill_init_list (mmsystem.dll) - END trace:dll:NE_CallDllEntryPoint Calling mmsystem.dll DllEntryPoint, cs:ip=00e7:0aa9 trace:shell:SHLWAPI_LibMain 0x40db4000 0x1 (nil) trace:shell:Shell32LibMain 0x40cd6000 0x1 (nil) trace:shell:SIC_Initialize trace:shell:SIC_IconAppend shell32.dll 1 3e6 3ee trace:shell:SHAlloc 20 bytes at 0x403dad4c trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 2 3e6 3ee trace:shell:SHAlloc 20 bytes at 0x403dae4c trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 3 3f6 3fe trace:shell:SHAlloc 20 bytes at 0x403dbf2c trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 4 406 406 trace:shell:SHAlloc 20 bytes at 0x403dc2d4 trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 5 3e6 3ee trace:shell:SHAlloc 20 bytes at 0x403daeac trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 6 3e6 3ee trace:shell:SHAlloc 20 bytes at 0x403dd954 trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 7 3e6 3ee trace:shell:SHAlloc 20 bytes at 0x403dd994 trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 8 40e 416 trace:shell:SHAlloc 20 bytes at 0x403dde2c trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 9 3e6 3ee trace:shell:SHAlloc 20 bytes at 0x403dda14 trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 10 3e6 3ee trace:shell:SHAlloc 20 bytes at 0x403dda54 trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 11 3e6 3ee trace:shell:SHAlloc 20 bytes at 0x403dda94 trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 12 3e6 3ee trace:shell:SHAlloc 20 bytes at 0x403deb14 trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 13 3e6 3ee trace:shell:SHAlloc 20 bytes at 0x403deb54 trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 14 3e6 3ee trace:shell:SHAlloc 20 bytes at 0x403deb94 trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 15 41e 426 trace:shell:SHAlloc 20 bytes at 0x403df02c trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 16 3e6 3ee trace:shell:SHAlloc 20 bytes at 0x403dec14 trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 17 3e6 3ee trace:shell:SHAlloc 20 bytes at 0x403dec54 trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 18 3e6 3ee trace:shell:SHAlloc 20 bytes at 0x403dec94 trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 19 3e6 3ee trace:shell:SHAlloc 20 bytes at 0x403dfd14 trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 20 3e6 3ee trace:shell:SHAlloc 20 bytes at 0x403dfd54 trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 21 3e6 3ee trace:shell:SHAlloc 20 bytes at 0x403dfd94 trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 22 3e6 3ee trace:shell:SHAlloc 20 bytes at 0x403dfdd4 trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 23 3e6 3ee trace:shell:SHAlloc 20 bytes at 0x403dfe14 trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 24 3e6 3ee trace:shell:SHAlloc 20 bytes at 0x403dfe54 trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 25 3e6 3ee trace:shell:SHAlloc 20 bytes at 0x403dfe94 trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 26 3e6 3ee trace:shell:SHAlloc 20 bytes at 0x403dfed4 trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 27 3e6 3ee trace:shell:SHAlloc 20 bytes at 0x403dff14 trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 28 3e6 3ee trace:shell:SHAlloc 20 bytes at 0x403dff54 trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 29 3e6 3ee trace:shell:SHAlloc 20 bytes at 0x403dff94 trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 30 3e6 3ee trace:shell:SHAlloc 20 bytes at 0x403dffd4 trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 31 3e6 3ee trace:shell:SHAlloc 20 bytes at 0x403e0014 trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 32 3e6 3ee trace:shell:SHAlloc 20 bytes at 0x403e0054 trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 33 3e6 3ee trace:shell:SHAlloc 20 bytes at 0x403e0094 trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 34 42e 436 trace:shell:SHAlloc 20 bytes at 0x403e1034 trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 35 3e6 3ee trace:shell:SHAlloc 20 bytes at 0x403dab6c trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 36 3e6 3ee trace:shell:SHAlloc 20 bytes at 0x403dabac trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 37 3e6 3ee trace:shell:SHAlloc 20 bytes at 0x403dabec trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_IconAppend shell32.dll 38 3e6 3ee trace:shell:SHAlloc 20 bytes at 0x403e1d1c trace:shell:PathFindFileNameA shell32.dll trace:shell:SIC_Initialize hIconSmall=0x40e5013c hIconBig=0x40e501c8 trace:shell:InitChangeNotifications head=0x40d20dc0 tail=0x40d20de0 trace:shell:SHInitRestricted ((nil), (nil)) trace:dll:NE_InitDLL Calling LibMain, cs:ip=0337:0000 ds=0387 di=0386 cx=1000 trace:dll:NE_InitDLL Calling LibMain, cs:ip=046f:0000 ds=0597 di=0596 cx=3e80 trace:dll:NE_InitDLL Calling LibMain, cs:ip=05b7:0000 ds=0617 di=0616 cx=0000 trace:dll:NE_InitDLL Calling LibMain, cs:ip=02f7:0000 ds=0317 di=0316 cx=0000 trace:dll:NE_InitDLL Calling LibMain, cs:ip=065f:0000 ds=06c7 di=06c6 cx=0200 trace:dll:fill_init_list (C:\Regis\PDV.EXE) - START trace:dll:fill_init_list (C:\REGIS\BORDCHQ.DLL) - START trace:dll:fill_init_list (C:\REGIS\PDVROT.DLL) - START trace:dll:fill_init_list (ddeml.dll) - START trace:dll:fill_init_list (ddeml.dll) - END trace:dll:fill_init_list (KRNL386.EXE) - START trace:dll:fill_init_list (KRNL386.EXE) - END trace:dll:fill_init_list (shell.dll) - START trace:dll:fill_init_list (shell.dll) - END trace:dll:fill_init_list (USER.EXE) - START trace:dll:fill_init_list (USER.EXE) - END trace:dll:fill_init_list (win87em.dll) - START trace:dll:fill_init_list (win87em.dll) - END trace:dll:fill_init_list (C:\REGIS\PDVROT.DLL) - END trace:dll:fill_init_list (C:\REGIS\BD.DLL) - START trace:dll:fill_init_list (C:\REGIS\BD.DLL) - END trace:dll:fill_init_list (C:\REGIS\IFDT.DLL) - START trace:dll:fill_init_list (C:\REGIS\IFDT.DLL) - END trace:dll:fill_init_list (C:\REGIS\BORDCHQ.DLL) - END trace:dll:fill_init_list (C:\REGIS\E$WIN.DLL) - START trace:dll:fill_init_list (C:\REGIS\E$WIN.DLL) - END trace:dll:fill_init_list (C:\REGIS\BWCC.DLL) - START trace:dll:fill_init_list (GDI.EXE) - START trace:dll:fill_init_list (GDI.EXE) - END trace:dll:fill_init_list (C:\REGIS\BWCC.DLL) - END trace:dll:fill_init_list (keyboard.dll) - START trace:dll:fill_init_list (keyboard.dll) - END trace:dll:fill_init_list (C:\Regis\PDV.EXE) - END trace:dll:NE_CallDllEntryPoint Calling shell.dll DllEntryPoint, cs:ip=03d7:0327 trace:shell:SHELL_DllEntryPoint (00000001, 03df, 03df, 0000, 00000000, 0000) trace:shell:ShellExecute16 (0021,'open','C:\REGIS\DISP.EXE','','C:\REGIS',1) trace:shell:SHLWAPI_LibMain 0x40db4000 0x2 (nil) trace:dll:fill_init_list (C:\REGIS\DISP.EXE) - START trace:dll:fill_init_list (C:\REGIS\BWCC.DLL) - START trace:dll:fill_init_list (GDI.EXE) - START trace:dll:fill_init_list (GDI.EXE) - END trace:dll:fill_init_list (KRNL386.EXE) - START trace:dll:fill_init_list (KRNL386.EXE) - END trace:dll:fill_init_list (USER.EXE) - START trace:dll:fill_init_list (USER.EXE) - END trace:dll:fill_init_list (C:\REGIS\BWCC.DLL) - END trace:dll:fill_init_list (ddeml.dll) - START trace:dll:fill_init_list (ddeml.dll) - END trace:dll:fill_init_list (mmsystem.dll) - START trace:dll:fill_init_list (mmsystem.dll) - END trace:dll:fill_init_list (C:\REGIS\DISP.EXE) - END trace:dll:NE_CallDllEntryPoint Calling mmsystem.dll DllEntryPoint, cs:ip=00e7:0aa9 trace:ddeml:WDML_Initialize (0x40f94290,0x88700ba,0x0,0) trace:ddeml:WDML_Initialize instance created - checking validity trace:ddeml:WDML_Initialize new instance, callback 0x88700ba flags 0 trace:ddeml:WDML_Initialize First application instance detected OK trace:ddeml:WDML_IncrementInstanceId New instance id 1 allocated trace:ddeml:WDML_Initialize New application instance processing finished OK trace:ddeml:DdeCreateStringHandleA (1,0x40f94755,1004) trace:ddeml:WDML_CreateString added atom "DISP" with HSZ 0xc000, trace:ddeml:DdeCreateStringHandleA (1,0x40f9475a,1004) trace:ddeml:WDML_CreateString added atom "Form1" with HSZ 0xc001, trace:ddeml:DdeCreateStringHandleA (1,0x40f94760,1004) trace:ddeml:WDML_CreateString added atom "label1" with HSZ 0xc002, trace:ddeml:DdeNameService (1,0xc000,0x0,1) trace:ddeml:WDML_FindServer Service name missing trace:ddeml:DdeNameService Adding service name trace:ddeml:DdeQueryStringA (1, 0xc000, 0x411a62c4, 256, 1004) trace:ddeml:DdeQueryStringA returning "DISP" trace:ddeml:DdeCreateStringHandleA (1,0x411a61c4,1004) trace:ddeml:WDML_CreateString added atom "DISP(0x0806b3c8)" with HSZ 0xc003, trace:ddeml:DdeNameService Created nameServer=10025 for instance=00000001 trace:ddeml:WDML_Initialize (0x403d3400,0x33f015d,0x10,0) trace:ddeml:WDML_Initialize instance created - checking validity trace:ddeml:WDML_Initialize new instance, callback 0x33f015d flags 10 trace:ddeml:WDML_Initialize Subsequent application instance - starting checks trace:ddeml:WDML_Initialize Application Instance checks finished trace:ddeml:WDML_IncrementInstanceId New instance id 2 allocated trace:ddeml:WDML_Initialize New application instance processing finished OK trace:ddeml:DdeCreateStringHandleA (2,0x403c54f8,1004) trace:ddeml:WDML_CreateString added atom "DISP" with HSZ 0xc000, trace:ddeml:DdeCreateStringHandleA (2,0x403c54fd,1004) trace:ddeml:WDML_CreateString added atom "Form1" with HSZ 0xc001, trace:ddeml:DdeCreateStringHandleA (2,0x403c5503,1004) trace:ddeml:WDML_CreateString added atom "label1" with HSZ 0xc002, trace:ddeml:DdeConnect (0x2,0xc000,0xc001,(nil)) trace:ddeml:WDML_ServerNameProc WM_DDE_INITIATE message received! trace:ddeml:WDML_ServerNameProc idInst=1, threadID=0x8073d60 trace:ddeml:WDML_MakeHszFromAtom c026 => L"DISP" trace:ddeml:DdeCreateStringHandleW (1,0x411a63e4,1200) trace:ddeml:WDML_CreateString added atom L"DISP" with HSZ 0xc000, trace:ddeml:WDML_MakeHszFromAtom c02e => L"Form1" trace:ddeml:DdeCreateStringHandleW (1,0x411a63dc,1200) trace:ddeml:WDML_CreateString added atom L"Form1" with HSZ 0xc001, trace:ddeml:DdeCmpStringHandles (c000<L"DISP"> c000<L"DISP">); trace:ddeml:WDML_InvokeCallback invoking CB16[088700ba] (4194 0 00000000 0xc001 0xc000 0 1092249376 0) trace:ddeml:WDML_InvokeCallback done => 00000000 err:ddeml:DdeConnect Done with INITIATE, but no Server window available fixme:ddeml:DdeGetLastError (2): error reporting is weakly implemented trace:ddeml:WDML_Initialize (0x40f94290,0x88700c2,0x0,0) trace:ddeml:WDML_Initialize instance created - checking validity trace:ddeml:WDML_Initialize reinitialisation of (0x40f94290,0x88700c2,0x0,0): stub trace:ddeml:WDML_MakeHszFromAtom c026 => L"DISP" trace:ddeml:DdeCreateStringHandleW (1,0x411a68ac,1200) trace:ddeml:WDML_CreateString added atom L"DISP" with HSZ 0xc000, trace:ddeml:WDML_MakeHszFromAtom c02b => L"DISP(0x0806b3c8)" trace:ddeml:DdeCreateStringHandleW (1,0x411a68a4,1200) trace:ddeml:WDML_CreateString added atom L"DISP(0x0806b3c8)" with HSZ 0xc003, trace:ddeml:WDML_InvokeCallback invoking CB16[088700ba] (32930 0 00000000 0xc000 0xc003 0 0 0) trace:ddeml:WDML_InvokeCallback done => 00000000 trace:dll:NE_InitDLL Calling LibMain, cs:ip=08d7:0000 ds=08df di=08df cx=1000 trace:dll:fill_init_list (C:\REGIS\COMUM.DLL) - START trace:dll:fill_init_list (KRNL386.EXE) - START trace:dll:fill_init_list (KRNL386.EXE) - END trace:dll:fill_init_list (USER.EXE) - START trace:dll:fill_init_list (USER.EXE) - END trace:dll:fill_init_list (C:\REGIS\COMUM.DLL) - END fixme:dialog:MSGBOX_OnInit system modal msgbox ! Not modal yet.
(c) backtrace from DdeConnect
=>0 0x40624070 (DdeConnect(idInst=0x2, hszService=0xc000, hszTopic=0xc001, pCC=0x0) [client.c:87] in libuser32.so) (ebp=40ca6bbc) 1 0x40620447 (DDEML_CallFrom16_p_long_lllp+0x3b(proc=0x4062614c, args=0x403b5f96) [ddeml.spec.c:62] in libuser32.so) (ebp=40ca6be0) 2 0x4008f21a (__wine_call_from_16_long+0x8e [relay16.s] in libntdll.so) (ebp=40ca6c10) 3 0x033f:0x075c (bp=a66c) 4 0x028f:0x0c52 (bp=a904) 5 0x0287:0x00e0 (bp=0000)
It seems that functions 3, 4 and 5 are from PDV.EXE. I should recompile PDV.EXE to include debugging symbols.
------------------------------------------------- This mail sent through IMP: webmail.vmn.com.br
list@vmn.com.br a écrit :
Hi,
Below is the initialisation code of PDV.EXE (a), the app that calls DISP.EXE and thens set's up DDE. Both are 16bit. I have added some comments to try and clarify the code. I have also added the output of wine --debugmsg +dll,+shell,+ddeml PDV.EXE (b).
Yesterday, I ran winedbg and set a breakpoint on DDeConnect. A backtrace from the function is below (c). The step through the function showed that
the trace is different from the other day. the other day, the second program was getting initialized (in a DDE standpoint) after the first one tried to connect here, this part goes well, but the XTYP_CONNECT on the server side (second program) returns 0, whereas it should return a non zero value when it accepts the connection there's some missing part in the 16/32 conversion for this message, so would you mind checking the reasons why XTYP_CONNECT on server side would return 0
A+
Eric,
On tuesday, I will run the test and write back.
I have detected that the second app is not coming up correctly due to problems in BWCC.DLL (Borland Window Component DLL). It seems the APP is not initializing correctly and so DDE is not being truly tested.
How can I "look inside" BWCC.DLL and see if it is doing some kind of strange calls outside win16/win32 API?
Thanks for the help with DDE.
Miguel
At 14:33 9/3/2002 +0100, you wrote:
list@vmn.com.br a écrit :
Hi,
Below is the initialisation code of PDV.EXE (a), the app that calls DISP.EXE and thens set's up DDE. Both are 16bit. I have added some comments to try and clarify the code. I have also added the output of wine --debugmsg +dll,+shell,+ddeml PDV.EXE (b).
Yesterday, I ran winedbg and set a breakpoint on DDeConnect. A backtrace from the function is below (c). The step through the function showed that
the trace is different from the other day. the other day, the second program was getting initialized (in a DDE standpoint) after the first one tried to connect here, this part goes well, but the XTYP_CONNECT on the server side (second program) returns 0, whereas it should return a non zero value when it accepts the connection there's some missing part in the 16/32 conversion for this message, so would you mind checking the reasons why XTYP_CONNECT on server side would return 0
A+