Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.18;
Скачать: 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 вся ветка

Текущий архив: 2005.09.18;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.04 c
14-1124697571
alles
2005-08-22 11:59
2005.09.18
Нужна утилитка


8-1115423579
ronyn
2005-05-07 03:52
2005.09.18
КАК ИЗБАВИТЬСЯ ОТ ТОРМОЖЕНИЯ ПРИ ПРОИГРЫВАНИИ?


14-1124796782
Antonn
2005-08-23 15:33
2005.09.18
Реализация голосования на сайте


4-1122532698
MegaVolt
2005-07-28 10:38
2005.09.18
Какое событие отвечает за изменение размеров колонки ListView?


3-1123152103
mvalera
2005-08-04 14:41
2005.09.18
Сортировка данных в завязаных базах.