请问一个DLL执行的时候如何得知自己所在的目录

解决方案 »

  1.   

    哦,没有说清楚,是不包含forms单元的,好像也就没有extractfiledir(application.exename)一说
      

  2.   

    有一个这样的API函数可以用的呀:DWORD GetModuleFileName(    HMODULE hModule, // handle to module to find filename for 
        LPTSTR lpFilename, // pointer to buffer for module path 
        DWORD nSize  // size of buffer, in characters 
       );从这个返回值lpFileName中得到路径不就行了吗?
      

  3.   

    我要调用SHBrowseForFolder来弹出特殊的文件夹窗体;
    编译时没问题; 但程序运行到
    SHGetPathFromIDList(idBrowse,tmp);
    时DELPHI一直报错,请教一下错在哪里了*_*?
    但是我在VB中都没有这种问题的!uses shlobj;procedure TForm1.Button1Click(Sender: TObject);
    var
      BrowseInfo: TBrowseInfo;
      DisplayName: array[0..MAX_PATH] of char;
      idBrowse,idl : PItemIDList;
      tmp : PChar;
      tmp1:string;
    begin
    SHGetSpecialFolderLocation(form1.Handle,17, idl);
      with BrowseInfo do begin
        hWndOwner:=form1.Handle;
        pidlRoot:=idl;
        pszDisplayName:=DisplayName;
        lpszTitle:='Please choose a folder!';
        ulFlags:=BIF_RETURNONLYFSDIRS;
        lpfn:=nil;
        lParam:=0;
      end;
      idBrowse:=SHBrowseForFolder(BrowseInfo);
      if assigned(idBrowse) then
      Begin
         SHGetPathFromIDList(idBrowse,tmp); // SHELL32。DLL错误?
         edit1.Text :=strpas(tmp);
      end;
    end;
      

  4.   

    恩,DWORD GetModuleFileName(HMODULE hModule...中间的第一个参数不好判断。据msdn说需要从窗口名字得到句柄在得到hmodule.问题是那个dll没有窗口,
    就发送一个消息就完了。。这怎么办呢
      

  5.   

    在你的Dll中加入以下函数,直接调用该函数就可以了。
    function ModulePath: Pchar; stdcall;
    var
      PS: array[0..255] of Char;
    begin
      if GetModuleFileName(HInstance, @PS[0], 256) = 0 then
        Result := ''
      else
        Result := PS;
    end;