DataSnap+ADO

 
0
 
Delphi, Kylix and Pascal
ava
guest | 10.01.2005, 11:55
Реализую трехзвенную архитектуру (DataSnap+ADO). Сервер реализован в виде библиотеки ActivX + Remote Data Modul. В итшге получается DLL. Клиент подключается через DCOMConnection.

ПРОБЛЕМА: В удаленном модуле (Remote Data Modul) у компонента ADOConnection мне необходимо программно формировать свойство ConnectionString. При использовании GetCurrentDir функция возвращает путь НЕ dll-сервера, а клиентского приложения. (Это естественно, т.к. сервер получился внутрипроцессорным и создается в адресном пространстве клиента).

ВОПРОС: Как все-таки узнать путь dll-сервера и написать процедуру в Remote Data Modul по формирования ConnectionString?
Ответы (11)
ava
<Spawn> | 11.01.2005, 06:32 #
Как вариант, можешь хранить путь реестре.
ava
guest | 12.01.2005, 10:12 #
Когда регистрируется dll-сервер, то в реестре итак вместе с GUID записывается путь. Но как среди нескольких локальных компьютеров определить, на каком из них установлен сервер?
(К тому же через реестр не лучший выход, т.к. в разных windows эта информация возможно заносится в разные ветви реестра)
ava
mutex | 13.01.2005, 23:26 #
А не может ли сам сервер, т.е. DLL-библиотека, иметь свойство или метод, который возвращает его полный сетевой адрес?
ava
Fantasist | 14.01.2005, 00:30 #
Цитата
При использовании GetCurrentDir


GetCurrentDir тут вообще не в кассу - он, кстати, может и не совпадать с местоположением программы. Тебе нужно использовать GetModuleFileName.

ava
guest | 14.01.2005, 09:41 #
Если можно поподробнее о GetModuleFileName: метод какого класса? и если можно пример.
ava
<Spawn> | 14.01.2005, 12:37 #
Это не метода класса, а функция из Windows.pas. Вот пример:


procedure TForm1.Button2Click(Sender: TObject);
const
FILE_NAME_SIZE = 256;
var
 FileName: PAnsiChar;
begin
 GetMem(FileName, FILE_NAME_SIZE);
 try
   ZeroMemory(FileName, FILE_NAME_SIZE);
   GetModuleFileName(0, FileName, FILE_NAME_SIZE);
   ShowMessage(FileName);
 finally
   FreeMem(FileName, FILE_NAME_SIZE);
 end;
end;
ava
guest | 14.01.2005, 16:33 #
Проверил код. Выдает все тот же путь приложения-клиента. Код вставлял и в саму библиотеку (library) и в удаленный модуль (unit).
ava
Fantasist | 14.01.2005, 19:35 #
Цитата
Проверил код. Выдает все тот же путь приложения-клиента. Код вставлял и в саму библиотеку (library) и в удаленный модуль (unit).


Потому что нефига первым параметром (hModule) передавать 0. В этом случае вы всегда получите имя модуля создавшего процесс.


В Delphi в юните SysInit определяется глобальная переменная hInstance, котрая принимает значение handle модуля. Именно ее и надо передавать.



function ModuleFileName:string;
const
BUF_SIZE = 1024;
var
size:integer;
begin
SetLength(Result,BUF_SIZE);
size:=GetModuleFileName(hInstance,pointer(Result),BUF_SIZE);
SetLength(Result,size);
end;
ava
guest | 15.01.2005, 15:06 #
Работает! Огромное спасибо Fantasist и всем кто принимал участие в обсуждении.
Последний вопрос: если клиент и сервер стоят на разных машинах, то выведет ли эта функция полное UNC имя? (хотя, наверное, нет)
ava
Fantasist | 15.01.2005, 19:06 #
Цитата
то выведет ли эта функция полное UNC имя


Нет конечно. Хендл модуля не будет валидным на другом компьютере - это же очевидно.
ava
guest | 16.01.2005, 10:20 #
Еще раз спасибо.
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
advanced
Отправить