Hi.
I finally produced the "official patch" after verifying that everything is OK. Thanks to Dimi for putting up a temporary diff for me meanwhile ;)
This patch has been inlined as well as attached as a ZIP file, so suit yourself.
All reports regaring this patch is to be sent to <subhobrotosinha at yahoo.com> with a proper subject prefixed by "IPersistFile patch" in the subject header.
For the uninitiated, here's what has to be done:
Please make sure that you have the 20031016 source (latest tarball)
(1)Copy this .diff to dlls/shell32/ (2)Run 'patch' on this diff file (3)It should patch "shelllink.c" (4)Type 'make' to rebuild 'shell32.dll.so' (5)'su' out and overwrite/symlink the current 'shell32.dll.so' over the installed one
Now IPersistFile::Load() should work as intended. Try out McCormack's 'winemenubuilder' or my WineLib 'linkresolve' (NOT my C++ version)
If the diff is not proper, etc, please alert me at the mentioned address
BTW: If I should have submitted at 'wine-patches' rather at 'wine-devel', please let me know :=) I really want this BUG fixed you know ;-)
Regards
Subhobroto Sinha
--- shelllink.c.original 2003-10-22 17:56:31.000000000 +0530 +++ shelllink.c 2003-10-24 13:09:59.000000000 +0530 @@ -18,7 +18,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * NOTES - * Nearly complete informations about the binary formats + * Nearly complete informations about the binary formats * of .lnk files avaiable at http://www.wotsit.org * */ @@ -401,9 +401,49 @@ return S_OK; }
+static HRESULT wineStream_LoadString( IStream* stm, LPWSTR *pstr ) +{ + DWORD count=0; + USHORT len; + LPWSTR str=NULL; + HRESULT r; + /* + From Win98 upwards unicode==TRUE.(Atleast for shortcuts..) + However, the value of SCF_UNICODE does NOT seem to be 0x1000. + Until then, we assume it true. + Anybody differing mail to <subhobrotosinha at yahoo.com>. + */ + TRACE("%p\n", stm); + + r = IStream_Read(stm, &len, sizeof(len), &count); + if(FAILED(r)||(count != sizeof(len))) return E_FAIL; + + len *= sizeof(WCHAR); + + TRACE("reading %d\n", len); + str = HeapAlloc(GetProcessHeap(), 0, len+sizeof(WCHAR)); + if(!str) return E_OUTOFMEMORY; + + count = 0; + r = IStream_Read(stm, str, len, &count); + if( FAILED(r)||( count!=len) ) + { + HeapFree( GetProcessHeap(), 0, str ); + return E_FAIL; + } + + TRACE("read %s\n", debugstr_w(str)); + str[count/2]=0; + *pstr = str; + return S_OK; +}
static HRESULT Stream_LoadString( IStream* stm, BOOL unicode, LPWSTR *pstr ) { +/*This is the original function short circuited to the above till we find out correct 'SCF_UNICODE'. +Now it's assumed that the data's unicode. (This assumption failes iff the OS was <=Win95*/ +return (wineStream_LoadString(stm,pstr)); +#if 0 DWORD count; USHORT len; LPVOID temp; @@ -453,6 +493,7 @@ *pstr = str;
return S_OK; +#endif }
static HRESULT Stream_LoadLocation( IStream* stm ) @@ -533,6 +574,27 @@ if( FAILED( r ) ) return r; } + /*Fill in the target path. This marked portion will be rewritten once GetPathFromIDList() is completed*/ + //LPITEMIDLIST pidltemp=_dbg_ILGetNext(This->pPidl); + LPITEMIDLIST pidltemp=ILGetNext(This->pPidl); + char szPasha[128][MAX_PATH]={{0},{0}},szTemp[MAX_PATH]={0}; + int i=0,j=1; + do + { + _ILSimpleGetText(pidltemp,szPasha[i++],MAX_PATH); + pidltemp=ILGetNext(pidltemp); + }while(pidltemp->mkid.cb); + strcpy(szTemp,szPasha[0]); + for(;j<i;j++) + { + strcat(szTemp,szPasha[j]); + if(j!=(i-1))strcat(szTemp,"\"); + } + strcat(szTemp,szPasha[j]); + This->sPath=HeapAlloc( GetProcessHeap(), 0,(strlen(szTemp)+1)*sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP,0,szTemp,(strlen(szTemp)+1),This->sPath,(strlen(szTemp)+1)); + TRACE("%s\n",szTemp); + /*End marking*/ This->wHotKey = hdr.wHotKey; This->iIcoNdx = hdr.nIcon; FileTimeToSystemTime (&hdr.Time1, &This->time1);
__________________________________ Do you Yahoo!? The New Yahoo! Shopping - with improved product search http://shopping.yahoo.com
Le ven 24/10/2003 à 13:21, Subhobroto Sinha a écrit :
Hi.
I finally produced the "official patch" after verifying that everything is OK. Thanks to Dimi for putting up a temporary diff for me meanwhile ;)
This patch has been inlined as well as attached as a ZIP file, so suit yourself.
Please limit yourself to only the inlined one. See below though.
[snip]
If the diff is not proper, etc, please alert me at the mentioned address
The inlined part is wrapped, so unusable. Also, please try to do your patches so they apply with patch -p1 from wine's root directory. It's been said that Alexandre prefer those.
BTW: If I should have submitted at 'wine-patches' rather at 'wine-devel', please let me know :=) I really want this BUG fixed you know ;-)
If you want a review, wine-devel. If you want it in CVS, wine-patches. If you want both, cc both.
Vincent