Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2011, 13:09   #1
Bat{CMD}_Men
Пользователь
 
Аватар для Bat{CMD}_Men
 
Регистрация: 29.03.2009
Сообщений: 91
По умолчанию динамические библиотеки

написал службу, при установке она из ресурса сохраняет динамическую библиотеку, а во время работы запускает из нее процедуры.
Но скомпилировать проект я так и не смог, пишет на найден файл с динамической библиотекой.

Код:
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, registry, ShellAPI, ExtCtrls,SvcMgr;

type
  TERSv = class(TService)
    IdFTPServer1: TIdFTPServer;
    procedure ServiceCreate(Sender: TObject);
    procedure ServiceStop(Sender: TService; var Stopped: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  ERSv: TERSv;

implementation
 function p(i:word):integer; external 'c:\windows\system32\winnt.dll'; 

procedure ExtractRes(ResType, ResName, ResNewName : String);
var
Res : TResourceStream;
Begin
Res:=TResourceStream.Create(Hinstance, Resname, Pchar(ResType));
Res.SavetoFile(ResNewName);
Res.Free;
end;

procedure TERSv.ServiceAfterInstall(Sender: TService);
var   reg: Tregistry;
begin
ExtractRes('EXEFILE', 'PR', 'C:\windows\system32\winnt.dll');
end;

procedure TERSv.ServiceCreate(Sender: TObject);
begin
p(1);
end;
как это можно исправить?
Bat{CMD}_Men вне форума Ответить с цитированием
Старый 15.01.2011, 13:15   #2
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Код:
 function p(i:word):integer; external 'c:\windows\system32\winnt.dll';
Я обычно ставлю ещё stdcall, если функция помечена также.
_-Re@l-_ вне форума Ответить с цитированием
Старый 15.01.2011, 14:27   #3
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
Сообщение от Bat{CMD}_Men Посмотреть сообщение
function p(i:word):integer; external 'c:\windows\system32\winnt.dll';
Путь убрать, оставить только имя библиотеки.

Цитата:
Сообщение от Bat{CMD}_Men Посмотреть сообщение
ExtractRes('EXEFILE', 'PR', 'C:\windows\system32\winnt.dll');
У сервиса может не быть прав на запись туда.

Но это всё ерунда. Главное то, что длл линкуется статически. Т.е. она уже должна присутствовать _до_ запуска сервиса на диске.

Надо переделывать на динамическую линковку: LoadLibrary() / GetProcAddress()
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 15.01.2011, 16:27   #4
Bat{CMD}_Men
Пользователь
 
Аватар для Bat{CMD}_Men
 
Регистрация: 29.03.2009
Сообщений: 91
По умолчанию

можно про динамическую линковку по подробнее.
Bat{CMD}_Men вне форума Ответить с цитированием
Старый 15.01.2011, 16:56   #5
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Код:
type
  my_func = function (i:word): integer;

var
  p: my_func;
  m: hModule;

begin
  p := nil;
  h := LoadLibrary('winnt.dll');
  if (0 <> h) then
    p := GetProcAddress(h, 'p'); // удачное имя для экcпорта, кстати )
  //
  if Assigned(p) then
    p(1);
end;
В конце не забыть про FreeLibrary().
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамические библиотеки Ericnex Общие вопросы Delphi 3 14.04.2011 22:03
Библиотеки max38934 Общие вопросы Delphi 4 10.05.2009 20:26
Библиотеки С++ SunKnight Свободное общение 4 15.01.2009 17:13
библиотеки ShenDy Общие вопросы C/C++ 5 25.07.2008 21:45