Вниз
Скачать: 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.024 c
4-1122287537
AxelBlack
2005-07-25 14:32
2005.09.18
Вопрос об использовании параметров WM_SysCommand в Perform


3-1123158611
Вольный Стрелок
2005-08-04 16:30
2005.09.18
Как определить список пользовательских (несистемных) индексов


3-1123503982
stud
2005-08-08 16:26
2005.09.18
вопрос по мс sql server 2000


1-1124922791
Aleksandr.
2005-08-25 02:33
2005.09.18
Прошу обратить внимание всем, кто работает с ActionMainMenuBar


1-1124787869
B-boy-Dimo-N
2005-08-23 13:04
2005.09.18
конфликт между JCL+JVCL 2.10 и QReport 4




   Наверх