Вниз
Скачать: CL | DM;

Как сделать, чтобы Win9x не искала библиотеку?   Найти похожие ветки 

← →
rolex   (2005-08-27 20:42) [0]

У меня прога должна работать в 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 не искал её?


← →
Sam Stone ©   (2005-08-27 20:46) [1]

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


← →
begin...end ©   (2005-08-27 20:47) [2]

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


← →
rolex   (2005-08-27 21:42) [3]

Нашёл пример, как загружать бибиотеку динамически:
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". А в примере нету его.
Так куда же его написать?



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.023 c
1-1124892902
ocean
2005-08-24 18:15
2005.09.18
Размер в см при печати


14-1124342604
Fresh123
2005-08-18 09:23
2005.09.18
Ср-ва разработки


1-1124785381
volser
2005-08-23 12:23
2005.09.18
Как приостановить поток?


5-1099825350
проходящий мимо
2004-11-07 14:02
2005.09.18
компонент на основе edit


2-1123573788
rolex
2005-08-09 11:49
2005.09.18
В событии Form1 onShow пишу Form2.ShowModal, но Form1 не показыва




   Наверх