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

📄 misc.c

📁 Wine-20031016
💻 C
📖 第 1 页 / 共 5 页
字号:
	}    }}/****************************************************************** *		WDML_QueryString * * */static int	WDML_QueryString(WDML_INSTANCE* pInstance, HSZ hsz, LPVOID ptr, DWORD cchMax,				 int codepage){    WCHAR	pString[MAX_BUFFER_LEN];    int		ret;    /* If psz is null, we have to return only the length     * of the string.     */    if (ptr == NULL)    {	ptr = pString;	cchMax = MAX_BUFFER_LEN;    }    switch (codepage)    {    case CP_WINANSI:	ret = GetAtomNameA(HSZ2ATOM(hsz), ptr, cchMax);	break;    case CP_WINUNICODE:	ret = GetAtomNameW(HSZ2ATOM(hsz), ptr, cchMax);    default:	ERR("Unknown code page %d\n", codepage);	ret = 0;    }    return ret;}/***************************************************************** * DdeQueryStringA [USER32.@] */DWORD WINAPI DdeQueryStringA(DWORD idInst, HSZ hsz, LPSTR psz, DWORD cchMax, INT iCodePage){    DWORD		ret = 0;    WDML_INSTANCE*	pInstance;    TRACE("(%ld, %p, %p, %ld, %d)\n", idInst, hsz, psz, cchMax, iCodePage);    EnterCriticalSection(&WDML_CritSect);    /*  First check instance     */    pInstance = WDML_GetInstance(idInst);    if (pInstance != NULL)    {	if (iCodePage == 0) iCodePage = CP_WINANSI;	ret = WDML_QueryString(pInstance, hsz, psz, cchMax, iCodePage);    }    LeaveCriticalSection(&WDML_CritSect);    TRACE("returning %ld (%s)\n", ret, debugstr_a(psz));    return ret;}/***************************************************************** * DdeQueryStringW [USER32.@] */DWORD WINAPI DdeQueryStringW(DWORD idInst, HSZ hsz, LPWSTR psz, DWORD cchMax, INT iCodePage){    DWORD		ret = 0;    WDML_INSTANCE*	pInstance;    TRACE("(%ld, %p, %p, %ld, %d)\n", idInst, hsz, psz, cchMax, iCodePage);    EnterCriticalSection(&WDML_CritSect);    /*  First check instance     */    pInstance = WDML_GetInstance(idInst);    if (pInstance != NULL)    {	if (iCodePage == 0) iCodePage = CP_WINUNICODE;	ret = WDML_QueryString(pInstance, hsz, psz, cchMax, iCodePage);    }    LeaveCriticalSection(&WDML_CritSect);    TRACE("returning %ld (%s)\n", ret, debugstr_w(psz));    return ret;}/****************************************************************** *		DML_CreateString * * */static	HSZ	WDML_CreateString(WDML_INSTANCE* pInstance, LPCVOID ptr, int codepage){    HSZ		hsz;    switch (codepage)    {    case CP_WINANSI:	hsz = ATOM2HSZ(AddAtomA(ptr));	TRACE("added atom %s with HSZ %p, \n", debugstr_a(ptr), hsz);	break;    case CP_WINUNICODE:	hsz = ATOM2HSZ(AddAtomW(ptr));	TRACE("added atom %s with HSZ %p, \n", debugstr_w(ptr), hsz);	break;    default:	ERR("Unknown code page %d\n", codepage);	return 0;    }    WDML_InsertHSZNode(pInstance, hsz);    return hsz;}/***************************************************************** * DdeCreateStringHandleA [USER32.@] * * RETURNS *    Success: String handle *    Failure: 0 */HSZ WINAPI DdeCreateStringHandleA(DWORD idInst, LPCSTR psz, INT codepage){    HSZ			hsz = 0;    WDML_INSTANCE*	pInstance;    TRACE("(%ld,%s,%d)\n", idInst, debugstr_a(psz), codepage);    EnterCriticalSection(&WDML_CritSect);    pInstance = WDML_GetInstance(idInst);    if (pInstance)    {	if (codepage == 0) codepage = CP_WINANSI;	hsz = WDML_CreateString(pInstance, psz, codepage);    }    LeaveCriticalSection(&WDML_CritSect);    return hsz;}/****************************************************************************** * DdeCreateStringHandleW [USER32.@]  Creates handle to identify string * * PARAMS * 	idInst   [I] Instance identifier * 	psz      [I] Pointer to string *	codepage [I] Code page identifier * RETURNS *    Success: String handle *    Failure: 0 */HSZ WINAPI DdeCreateStringHandleW(DWORD idInst, LPCWSTR psz, INT codepage){    WDML_INSTANCE*	pInstance;    HSZ			hsz = 0;    TRACE("(%ld,%s,%d)\n", idInst, debugstr_w(psz), codepage);    EnterCriticalSection(&WDML_CritSect);    pInstance = WDML_GetInstance(idInst);    if (pInstance)    {	if (codepage == 0) codepage = CP_WINUNICODE;	hsz = WDML_CreateString(pInstance, psz, codepage);    }    LeaveCriticalSection(&WDML_CritSect);    return hsz;}/***************************************************************** *            DdeFreeStringHandle   (USER32.@) * RETURNS: success: nonzero *          fail:    zero */BOOL WINAPI DdeFreeStringHandle(DWORD idInst, HSZ hsz){    WDML_INSTANCE*	pInstance;    BOOL		ret = FALSE;    TRACE("(%ld,%p): \n", idInst, hsz);    EnterCriticalSection(&WDML_CritSect);    /*  First check instance     */    pInstance = WDML_GetInstance(idInst);    if (pInstance)	ret = WDML_DecHSZ(pInstance, hsz);    LeaveCriticalSection(&WDML_CritSect);    return ret;}/***************************************************************** *            DdeKeepStringHandle  (USER32.@) * * RETURNS: success: nonzero *          fail:    zero */BOOL WINAPI DdeKeepStringHandle(DWORD idInst, HSZ hsz){    WDML_INSTANCE*	pInstance;    BOOL		ret = FALSE;    TRACE("(%ld,%p): \n", idInst, hsz);    EnterCriticalSection(&WDML_CritSect);    /*  First check instance     */    pInstance = WDML_GetInstance(idInst);    if (pInstance)	ret = WDML_IncHSZ(pInstance, hsz);    LeaveCriticalSection(&WDML_CritSect);    return ret;}/***************************************************************** *            DdeCmpStringHandles (USER32.@) * * Compares the value of two string handles.  This comparison is * not case sensitive. * * Returns: * -1 The value of hsz1 is zero or less than hsz2 * 0  The values of hsz 1 and 2 are the same or both zero. * 1  The value of hsz2 is zero of less than hsz1 */INT WINAPI DdeCmpStringHandles(HSZ hsz1, HSZ hsz2){    WCHAR	psz1[MAX_BUFFER_LEN];    WCHAR	psz2[MAX_BUFFER_LEN];    int		ret = 0;    int		ret1, ret2;    ret1 = GetAtomNameW(HSZ2ATOM(hsz1), psz1, MAX_BUFFER_LEN);    ret2 = GetAtomNameW(HSZ2ATOM(hsz2), psz2, MAX_BUFFER_LEN);    TRACE("(%p<%s> %p<%s>);\n", hsz1, debugstr_w(psz1), hsz2, debugstr_w(psz2));    /* Make sure we found both strings. */    if (ret1 == 0 && ret2 == 0)    {	/* If both are not found, return both  "zero strings". */	ret = 0;    }    else if (ret1 == 0)    {	/* If hsz1 is a not found, return hsz1 is "zero string". */	ret = -1;    }    else if (ret2 == 0)    {	/* If hsz2 is a not found, return hsz2 is "zero string". */	ret = 1;    }    else    {	/* Compare the two strings we got (case insensitive). */	ret = lstrcmpiW(psz1, psz2);	/* Since strcmp returns any number smaller than	 * 0 when the first string is found to be less than	 * the second one we must make sure we are returning	 * the proper values.	 */	if (ret < 0)	{	    ret = -1;	}	else if (ret > 0)	{	    ret = 1;	}    }    return ret;}/* ================================================================ * * 			Data handle management * * ================================================================ *//***************************************************************** *            DdeCreateDataHandle (USER32.@) */HDDEDATA WINAPI DdeCreateDataHandle(DWORD idInst, LPBYTE pSrc, DWORD cb, DWORD cbOff,                                    HSZ hszItem, UINT wFmt, UINT afCmd){    /* For now, we ignore idInst, hszItem.     * The purpose of these arguments still need to be investigated.     */    HGLOBAL     		hMem;    LPBYTE      		pByte;    DDE_DATAHANDLE_HEAD*	pDdh;    WCHAR psz[MAX_BUFFER_LEN];    GetAtomNameW(HSZ2ATOM(hszItem), psz, MAX_BUFFER_LEN);    TRACE("(%ld,%p,cb %ld, cbOff %ld,%p <%s>,%x,%x)\n",	  idInst, pSrc, cb, cbOff, hszItem, debugstr_w(psz), wFmt, afCmd);    if (afCmd != 0 && afCmd != HDATA_APPOWNED)        return 0;    /* we use the first 4 bytes to store the size */    if (!(hMem = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, cb + cbOff + sizeof(DDE_DATAHANDLE_HEAD))))    {	ERR("GlobalAlloc failed\n");	return 0;    }    pDdh = (DDE_DATAHANDLE_HEAD*)GlobalLock(hMem);    if (!pDdh)    {        GlobalFree(hMem);        return 0;    }    pDdh->cfFormat = wFmt;    pDdh->bAppOwned = (afCmd == HDATA_APPOWNED);    pByte = (LPBYTE)(pDdh + 1);    if (pSrc)    {	memcpy(pByte, pSrc + cbOff, cb);    }    GlobalUnlock(hMem);    return (HDDEDATA)hMem;}/***************************************************************** * *            DdeAddData (USER32.@) */HDDEDATA WINAPI DdeAddData(HDDEDATA hData, LPBYTE pSrc, DWORD cb, DWORD cbOff){    DWORD	old_sz, new_sz;    LPBYTE	pDst;    TRACE("(%p,%p,cb %ld, cbOff %ld)\n", hData, pSrc, cb, cbOff);    pDst = DdeAccessData(hData, &old_sz);    if (!pDst) return 0;    new_sz = cb + cbOff;    if (new_sz > old_sz)    {	DdeUnaccessData(hData);	hData = GlobalReAlloc((HGLOBAL)hData, new_sz + sizeof(DDE_DATAHANDLE_HEAD),			      GMEM_MOVEABLE | GMEM_DDESHARE);	pDst = DdeAccessData(hData, &old_sz);    }    if (!pDst) return 0;    memcpy(pDst + cbOff, pSrc, cb);    DdeUnaccessData(hData);    return hData;}/****************************************************************************** * DdeGetData [USER32.@]  Copies data from DDE object to local buffer * * * PARAMS * hData	[I] Handle to DDE object * pDst		[I] Pointer to destination buffer * cbMax	[I] Amount of data to copy * cbOff	[I] Offset to beginning of data * * RETURNS *    Size of memory object associated with handle */DWORD WINAPI DdeGetData(HDDEDATA hData, LPBYTE pDst, DWORD cbMax, DWORD cbOff){    DWORD   dwSize, dwRet;    LPBYTE  pByte;    TRACE("(%p,%p,%ld,%ld)\n", hData, pDst, cbMax, cbOff);    pByte = DdeAccessData(hData, &dwSize);    if (pByte)    {        if (!pDst)        {            dwRet = dwSize;        }        else if (cbOff + cbMax < dwSize)	{	    dwRet = cbMax;	}	else if (cbOff < dwSize)	{	    dwRet = dwSize - cbOff;	}	else	{	    dwRet = 0;	}	if (pDst && dwRet != 0)	{	    memcpy(pDst, pByte + cbOff, dwRet);	}	DdeUnaccessData(hData);    }    else    {	dwRet = 0;    }    return dwRet;}/***************************************************************** *            DdeAccessData (USER32.@) */LPBYTE WINAPI DdeAccessData(HDDEDATA hData, LPDWORD pcbDataSize){    HGLOBAL			hMem = (HGLOBAL)hData;    DDE_DATAHANDLE_HEAD*	pDdh;    TRACE("(%p,%p)\n", hData, pcbDataSize);    pDdh = (DDE_DATAHANDLE_HEAD*)GlobalLock(hMem);    if (pDdh == NULL)    {	ERR("Failed on GlobalLock(%p)\n", hMem);	return 0;    }    if (pcbDataSize != NULL)    {	*pcbDataSize = GlobalSize(hMem) - sizeof(DDE_DATAHANDLE_HEAD);    }    TRACE("=> %p (%lu)\n", pDdh + 1, GlobalSize(hMem) - sizeof(DDE_DATAHANDLE_HEAD));    return (LPBYTE)(pDdh + 1);}/***************************************************************** *            DdeUnaccessData (USER32.@) */BOOL WINAPI DdeUnaccessData(HDDEDATA hData){    HGLOBAL hMem = (HGLOBAL)hData;    TRACE("(%p)\n", hData);    GlobalUnlock(hMem);    return TRUE;}/***************************************************************** *            DdeFreeDataHandle   (USER32.@) */BOOL WINAPI DdeFreeDataHandle(HDDEDATA hData){    TRACE("(%p)\n", hData);    return GlobalFree((HGLOBAL)hData) == 0;}/****************************************************************** *		WDML_IsAppOwned * * */BOOL WDML_IsAppOwned(HDDEDATA hData){    DDE_DATAHANDLE_HEAD*	pDdh;    BOOL                        ret = FALSE;    pDdh = (DDE_DATAHANDLE_HEAD*)GlobalLock((HGLOBAL)hData);    if (pDdh != NULL)    {        ret = pDdh->bAppOwned;

⌨️ 快捷键说明

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