⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wdedde.c

📁 开放源码的编译器open watcom 1.6.0版的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
        hdata = DdeCreateDataHandle( IdInst, (LPBYTE)data, size, 0,
                                     hNameItem, WdeDataClipbdFormat, 0 );
        WdeMemFree( data );
    }

    return( hdata );
}

HDDEDATA WdeCreateResData( WdeResDlgItem *ditem )
{
    HDDEDATA    hdata;
    void        *data;
    uint_32     size;

    hdata = (HDDEDATA)NULL;

    if( WdeGetItemData( ditem, &data, &size ) ) {
        hdata = DdeCreateDataHandle( IdInst, (LPBYTE)data, size, 0,
                                     hDataItem, WdeDataClipbdFormat, 0 );
        WdeMemFree( data );
    }

    return( hdata );
}

WdeResDlgItem *WdeGetDlgItem( void )
{
    WdeResInfo          *rinfo;
    WdeResDlgItem       *ditem;

    ditem = NULL;
    rinfo = WdeGetCurrentRes();
    if( rinfo && rinfo->dlg_item_list ) {
        ditem = (WdeResDlgItem *) ListElement( rinfo->dlg_item_list );
    }

    return( ditem );
}

Bool WdeUpdateDDEEditSession( void )
{
    WdeResInfo          *rinfo;
    WdeResDlgItem       *ditem;
    HDDEDATA            hdata;
    Bool                ok;

    hdata = (HDDEDATA)NULL;
    ditem = WdeGetDlgItem();
    ok = ( ( WdeClientConv != (HCONV)NULL ) && ( ditem != NULL ) );

    if( ok ) {
        hdata = WdeCreateResData( ditem );
        ok = ( hdata != (HDDEDATA)NULL );
    }

    if( ok ) {
        ok = (Bool) DdeClientTransaction( (LPBYTE)hdata, -1, WdeClientConv,
                                          hDataItem, WdeDataClipbdFormat,
                                          XTYP_POKE, TIME_OUT, NULL );
    }

    if( hdata != (HDDEDATA)NULL ) {
        DdeFreeDataHandle( hdata );
    }

    if( ok ) {
        hdata = WdeCreateResNameData( ditem->dialog_name, ditem->is32bit );
        ok = ( hdata != (HDDEDATA)NULL );
    }

    if( ok ) {
        ok = (Bool) DdeClientTransaction( (LPBYTE)hdata, -1, WdeClientConv,
                                          hNameItem, WdeDataClipbdFormat,
                                          XTYP_POKE, TIME_OUT, NULL );
    }

    if( hdata != (HDDEDATA)NULL ) {
        DdeFreeDataHandle( hdata );
    }

    if( ok ) {
        rinfo = WdeGetCurrentRes();
        WdeSetResModified( rinfo, FALSE );
    }

    return( ok );
}

Bool WdeStartDDEEditSession( void )
{
    WdeResInfo          *rinfo;
    WdeResDlgItem       *ditem;
    char                *filename;
    HDDEDATA            hData;
    void                *data;
    DWORD               ret;
    uint_32             size;
    OBJPTR              object;
    Bool                ok;

    object = NULL;
    ditem = WdeAllocResDlgItem();
    ok = ( ditem != NULL );

    if( ok ) {
        hData = DdeClientTransaction( NULL, 0, WdeClientConv,
                                      hFileItem, WdeDataClipbdFormat,
                                      XTYP_REQUEST, TIME_OUT, &ret );
        ok = ( hData != (HDDEDATA)NULL );
    }

    if( ok ) {
        filename = (char *)WdeHData2Mem( hData );
        DdeFreeDataHandle( hData );
        ok = ( filename != NULL );
    }

    if( ok ) {
        hData = DdeClientTransaction( NULL, 0, WdeClientConv,
                                      hIs32BitItem, WdeDataClipbdFormat,
                                      XTYP_REQUEST, TIME_OUT, &ret );
        if( hData != (HDDEDATA)NULL ) {
            ditem->is32bit = TRUE;
            DdeFreeDataHandle( hData );
        }
    }

    if( ok ) {
        hData = DdeClientTransaction( NULL, 0, WdeClientConv,
                                      hNameItem, WdeDataClipbdFormat,
                                      XTYP_REQUEST, TIME_OUT, &ret );
        ok = ( hData != (HDDEDATA)NULL );
    }

    if( ok ) {
        data = WdeHData2Mem( hData );
        DdeFreeDataHandle( hData );
        ok = ( data != NULL );
    }

    if( ok ) {
        ditem->dialog_name = WRMem2WResID( data, ditem->is32bit );
        ok = ( ditem->dialog_name != NULL );
        WdeMemFree( data );
    }

    if( ok ) {
        hData = DdeClientTransaction( NULL, 0, WdeClientConv,
                                      hDataItem, WdeDataClipbdFormat,
                                      XTYP_REQUEST, TIME_OUT, &ret );
        if( hData != (HDDEDATA)NULL ) {
            data = WdeHData2Mem( hData );
            size = (int)DdeGetData( hData, NULL, 0, 0 );
            DdeFreeDataHandle( hData );
            if( data ) {
                ditem->dialog_info = WdeMem2DBI( (uint_8 *)data, size,
                                                 ditem->is32bit );
                ok = ( ditem->dialog_info != NULL );
                WdeMemFree( data );
            } else {
                ok = FALSE;
            }
        }
    }

    if( ok ) {
        rinfo = WdeCreateNewResource( filename );
        ok = ( rinfo != NULL );
    }

    if( ok ) {
        if( ditem->dialog_info ) {
            ok = WdeOpenDialogFromResInfo( rinfo, ditem );
            if( ok ) {
                WdeAddResDlgItemToResInfo( rinfo, ditem );
                object = ditem->object;
            }
        } else {
            object = WdeCreateNewDialog( ditem->dialog_name, ditem->is32bit );
            if( ditem ) {
                WdeFreeResDlgItem( &ditem, TRUE );
            }
            ditem = NULL;
        }
        ok = ok && ( object != NULL );
    }

    if( ok ) {
        MakeObjectCurrent( object );
    }

    if( !ok ) {
        if( ditem ) {
            WdeFreeResDlgItem( &ditem, TRUE );
        }
        if( rinfo ) {
            WdeFreeResInfo( rinfo );
        }
    }

    if( filename ) {
        WdeMemFree( filename );
    }

    return( ok );
}

static Bool GotEndSession = FALSE;
void WdeHandlePokedData( HDDEDATA hdata )
{
    HWND        main;
    char        *cmd;
    WdeResInfo  *rinfo;

    if( hdata == (HDDEDATA)NULL ) {
        return;
    }

    cmd = (char *)WdeHData2Mem( hdata );
    if( cmd == NULL ) {
        return;
    }

    main = WdeGetMainWindowHandle();

    if( !stricmp( cmd, "show" ) ) {
        ShowWindow( main, SW_RESTORE );
        ShowWindow( main, SW_SHOWNA );
    } else if( !stricmp( cmd, "hide" ) ) {
        ShowWindow( main, SW_SHOWMINNOACTIVE );
        ShowWindow( main, SW_HIDE );
    } else if( !stricmp( cmd, "endsession" ) ) {
        if( GotEndSession == FALSE ) {
            GotEndSession = TRUE;
            rinfo = WdeGetCurrentRes();
            WdeDestroyResourceWindow( rinfo );
        }
    } else if( !stricmp( cmd, "bringtofront" ) ) {
        if( IsIconic( main ) ) {
            ShowWindow( main, SW_RESTORE );
        }
#ifdef __NT__
        SetWindowPos( main, HWND_TOPMOST, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE );
        SetWindowPos( main, HWND_TOP, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE );
        SetWindowPos( main, HWND_NOTOPMOST, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE );
        SetForegroundWindow( main );
#else
        SetActiveWindow( main );
        SetWindowPos( main, HWND_TOP, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE );
#endif
    }

    WdeMemFree( cmd );
}

HDDEDATA WINEXPORT DdeCallBack( WORD wType, WORD wFmt, HCONV hConv,
                               HSZ hsz1, HSZ hsz2, HDDEDATA hdata,
                               DWORD lData1, DWORD lData2 )
{
    HWND                hmain;
    HSZPAIR             hszpair[2];
    HDDEDATA            ret;
    WdeResDlgItem       *ditem;

    _wde_touch(wFmt);
    _wde_touch(hdata);
    _wde_touch(lData1);
    _wde_touch(lData2);

    ret = (HDDEDATA)NULL;

    switch( wType ) {
        case XTYP_CONNECT_CONFIRM:
            WdeServerConv = hConv;
            break;

        case XTYP_DISCONNECT:
            WdeServerConv = (HCONV)NULL;
            WdeClientConv = (HCONV)NULL;
            hmain = WdeGetMainWindowHandle();
            SendMessage( hmain, WM_CLOSE, (WPARAM)1, 0 );
            break;

        case XTYP_CONNECT:
            if( (WdeServerConv == (HCONV)NULL) && (hsz1 == hDialogTopic) ) {
                ret = (HDDEDATA)TRUE;
            }
            break;

        case XTYP_WILDCONNECT:
            if( hsz2 != hDialogService ) {
                break;
            }
            hszpair[0].hszSvc   = hDialogService;
            hszpair[0].hszTopic = hDialogTopic;
            hszpair[1].hszSvc   = (HSZ)NULL;
            hszpair[1].hszTopic = (HSZ)NULL;
            ret = (HDDEDATA)
                DdeCreateDataHandle( IdInst, (LPBYTE)&hszpair[0],
                                     sizeof(hszpair), 0L, 0, CF_TEXT, 0 );
            break;

        case XTYP_REQUEST:
            if( wFmt == WdeDataClipbdFormat ) {
                if( hsz1 == hTopic ) {
                    ditem = WdeGetDlgItem();
                    if( hsz2 == hDataItem ) {
                        ret = WdeCreateResData( ditem );
                    } else if( hsz2 == hNameItem ) {
                        ret = WdeCreateResNameData( ditem->dialog_name, ditem->is32bit );
                    }
                }
            }
            break;

        case XTYP_POKE:
            ret = (HDDEDATA)DDE_FNOTPROCESSED;
            if( hsz1 == hDialogTopic ) {
                if( hsz2 == hDataItem ) {
                    WdeHandlePokedData( hdata );
                    ret = (HDDEDATA)DDE_FACK;
                }
            }
            break;

    }

    return( ret );
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -