一个关于Delphi代码段移植向BCB的问题,使用BCB的同志看过来。(100分)

L

lig

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大虾好:
前几天在大富翁论坛上查资料时找到了这份代码,具体是用来建立桌面快捷方式的。如下所示。
//在桌面上建立快捷方式
procedure TForm1.Button1Click(Sender: TObject);
var
tmpObject : IUnknown;
tmpSLink : IShellLink;
tmpPFile : IPersistFile;
PIDL : PItemIDList;
StartupDirectory : array[0..MAX_PATH] of Char;
StartupFilename : String;
LinkFilename : WideString;
begin
StartupFilename := 'c:/windows/notepad.exe';
tmpObject := CreateComObject(CLSID_ShellLink);//创建建立快捷方式的外壳扩展
tmpSLink := tmpObject as IShellLink;//取得接口
tmpPFile := tmpObject as IPersistFile;//用来储存*.lnk文件的接口
{以上两行是否应该移植为?
tmpSLink=(IShellLink*)tmpObject;
tmpPFile=(IPersistFile*)tmpObject;
如果按以上两行代码进行移植,那么程序执行到下一行时会了错。}
tmpSLink.SetPath(pChar(StartupFilename));//设定notepad.exe所在路径
tmpSLink.SetWorkingDirectory(pChar(ExtractFilePath(StartupFilename)));//设定工作目录
SHGetSpecialFolderLocation(0,CSIDL_DESKTOPDIRECTORY,PIDL);//获得桌面的Itemidlist
SHGetPathFromIDList(PIDL,StartupDirectory);//获得桌面路径
LinkFilename := StartupDirectory + '/MyNotepad.lnk';
tmpPFile.Save(pWChar(LinkFilename),FALSE);//保存*.lnk文件
end;

虽然这段代码并不复杂,但是我在把它移植向BCB的过程中依然是出现了很多的问题,出于某种原因,我并不想拿出我移植的代码来让您来改错,而是想看到您所移植具体代码。
给所剩下的分不多了,给30分还算过得去吧?
 
问你一下,IShellLink是在哪个头文件里声明的。我找了半天也没有找到.
 
Shlobj.pas
 
请看下面的BCB代码。
在桌面上创建一个快捷方式
void TForm1::CreateShortCut(const AnsiString &file)
{
IShellLink* pLink;
IPersistFile* pPersistFile;
LPMALLOC ShellMalloc;
LPITEMIDLIST DesktopPidl;
char DesktopDir[MAX_PATH];
if(FAILED(SHGetMalloc(&ShellMalloc))) return;
if(FAILED(SHGetSpecialFolderLocation(NULL,CSIDL_DESKTOPDIRECTORY,&DesktopPidl))) return;
if(!SHGetPathFromIDList(DesktopPidl, DesktopDir))
{
ShellMalloc->Free(DesktopPidl);
ShellMalloc->Release();
return;
}
ShellMalloc->Free(DesktopPidl);
ShellMalloc->Release();
if(SUCCEEDED(CoInitialize(NULL)))
{
if(SUCCEEDED(CoCreateInstance(CLSID_ShellLink, NULL,
CLSCTX_INPROC_SERVER,IID_IShellLink, (void **) &pLink)))
{
pLink->SetPath(file.c_str());
pLink->SetDescription("Woo hoo, look at Homer's shortcut");
pLink->SetShowCmd(SW_SHOW);
if(SUCCEEDED(pLink->QueryInterface(IID_IPersistFile,(void **)&pPersistFile)))
{
WideString strShortCutLocation(DesktopDir);
strShortCutLocation += "//bcbshortcut.lnk";
pPersistFile->Save(strShortCutLocation.c_bstr(), TRUE);
pPersistFile->Release();
}
pLink->Release();
}
CoUninitialize();
}
}
 
热血你好。
关于如何查找指定的函数在何头文件中这里教你一招。
打开WIN98的查找文件功能(F3键),然后在“名含文字”中输入在查找内容
IShellLink,在“名称”中输入要查找文件(*.h;*.hpp或者*.pas),最后再在搜索
一栏中添入BCB头文件或VCL源码的路径后查找即可开始查找。
如果查找到了多个文件,可以用编辑器打开看一下,以确定函数的声明在哪个文件
中。
另外o&o的方法我还没有试,但是看上去好像可行。由于眼看就快过年了。所以如果o&o的答案正确的话,那么过全三十之后再给o&o加分。
 
发分来了。
虽然O*O的答案能很好的解决建立桌面快捷方式的问题。但是我的心里还是有着些许
的遗憾,我提供的那段DELPHI代码为什么不能正确的移植呢?只有等到以后我慢慢的
研究了。
此外100分啊,我心痛了,当时只因为鼠标错点了一下,才造成了血的代价,O*O你真
的应该好好的谢谢我才是。
说归说,我在这里还是有一个问题想再次请教你,即:如何判断一个快捷方式的一些
信息,如指向的程序,路径等等。请用BCB代码写好吗?谢谢。
 
顶部