Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как сделать, чтобы Win9x не искала библиотеку? [D7, Win95/98, WinME, NT4, Win2k, WinXP]


rolex ©   (2005-08-27 20:42:00) 

У меня прога должна работать в WinXP и Win9x.
Если прога запускается в WinXP, то функция берется из библиотеки (userenv.dll), а если в Win9x, то работает свой код.

в Public написал:
function GetProfilesDirectory:string;

В коде программы написал:

function ProfilesDirectory_Exp(lpProfilesDir:PChar; var lpcchSize:DWord):Bool;
stdcall; external 'userenv.dll' name 'GetProfilesDirectoryA';

function TForm1.GetProfilesDirectory:string;
var szBuffer:array[0..MAX_PATH] of Char; dwSize:DWord;
begin
dwSize := MAX_PATH;
if ProfilesDirectory_Exp(szBuffer, dwSize) then result:=szBuffer;
end;


Вызов делаю так:
if Win32Platform=VER_PLATFORM_WIN32_NT then
 Переменная:=Form1.GetProfilesDirectory
 else Переменная:='';


Но даже если не вызывать функцию из этой библиотеки, то при запуске проги в Win9x, вылетает ошибка, что не найдена библиотека.
Так как же сделать так, чтобы Win9x не искал её?


rolex   (2005-08-27 21:42:00) [1]

Нашёл пример, как загружать бибиотеку динамически:
unit untMain;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 Tcalc_double = function ( r: real ): real;

 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
 hndDLLHandle: THandle;
 calc_double: Tcalc_double;
begin
 try
   // загружаем dll динамически
   hndDLLHandle := loadLibrary ( 'ExDouble.dll' );

   if hndDLLHandle <> 0 then
   begin

     // получаем адрес функции
     @calc_double := getProcAddress ( hndDLLHandle, 'calc_double' );

     // если адрес функции найден
     if addr ( calc_double ) <> nil then
     begin
       // показываем результат ( 21...)
       showMessage ( floatToStr ( calc_double ( 10.5 ) ) );
     end
     else
       // DLL не найдена ("handleable")
       showMessage ( 'Function not exists...' );

   end
   else
     // DLL не найдена ("handleable")
     showMessage ( 'DLL not found...' );

 finally
   // liberar
   freeLibrary ( hndDLLHandle );
 end;
end;

end.


Но у меня при вызове ф-ции статистически ( function ProfilesDirectory_Exp(lpProfilesDir:PChar; var lpcchSize:DWord):Bool;
stdcall; external 'userenv.dll' name 'GetProfilesDirectoryA';

) есть указатель (или как его назвать) name 'GetProfilesDirectoryA'. А в примере нету его.
Так куда же его написать?


begin...end   (2005-08-27 20:47:00) [2]

Анализировать платформу и загружать библиотеку динамически?


Sam Stone   (2005-08-27 20:46:00) [3]

Используй динамическую загрузку DLL (как пользовать смотри в разделе "статьи")


Наверх

Титульная страница Поиск, карта сайта Написать письмо