Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 233

/ вопрос открыт /

Приветствую, уважаемые эксперты! С наступающим новым годом. Буду признателен если вы подскажете.
Существует библиотека dll. Библиотека содержит модуль данных на котором расположены компоненты для доступа к данным. Сам код библиотеки принимает (из службы) строку подключения к субд Oracle и пытается подключиться. Но подключения не происходит.

Приложение:
  1. library ArhPhErr;
  2.  
  3. uses
  4. SysUtils,
  5. Classes,
  6. DataUnitdll in 'DataUnitdll.pas' {DataModule1: TDataModule};
  7.  
  8. {$R *.res}
  9. function Connect(Username,Password,Server: String): Boolean; stdCall;
  10. begin
  11. try
  12. With datamodule1 do
  13. begin
  14. Try
  15. OraSession1.Username:=Username;
  16. OraSession1.Password:=Password;
  17. OraSession1.Server:=Server;
  18. OraSession1.ConnectPrompt:=False;
  19. OraSession1.Connected:=True;
  20. result:=True;
  21. except
  22. Result:=False;
  23. end;
  24. end;
  25. except
  26. Result:=False;
  27. end;
  28. end;
  29.  
  30. Function Get_count(Bool : boolean) : integer; stdcall;
  31. begin
  32. If bool = true then
  33. Begin
  34. DataModule1.count.active:=True;
  35. result:=DataModule1.count.Fields[0].AsInteger;
  36. end
  37. else
  38. If bool = False then
  39. begin
  40. DataModule1.count.active:=False;
  41. result:=0;
  42. end;
  43. end;
  44.  
  45. function ExArhErr(Archstart : Boolean) : boolean; stdCall;
  46. Begin
  47. With datamodule1 do
  48. begin
  49. Try
  50. OraScript1.SQL.Clear;
  51. OraScript1.SQL.Add('DECLARE');
  52. OraScript1.SQL.Add('Sysday NUMBER;');
  53. OraScript1.SQL.Add('CURSOR c1 IS');
  54. OraScript1.SQL.Add('SELECT fa.phone_6,fa.data_in,fa.adopted,fa.mex,fa.data_out,fa.TYPE,dp.NAME,dp.port_asl,dp.stan,');
  55. OraScript1.SQL.Add('dp.lin,dp.sak,dp.raspred,ap.street,ap.house,ap.house_ndx,ap.flat,fa.req');
  56. OraScript1.SQL.Add('FROM failures fa, dep_phone dp, adres_pop ap');
  57. OraScript1.SQL.Add('WHERE (fa.phone_6 = dp.phone_6) AND (dp.id = ap.id) AND');
  58. OraScript1.SQL.Add('Months_Between(SYSDATE,fa.data_out) >= 2 AND fa.data_out IS NOT null;') ;
  59. OraScript1.SQL.Add('BEGIN');
  60. OraScript1.SQL.Add('FOR ROWS IN c1 LOOP');
  61. OraScript1.SQL.Add('INSERT INTO archiv_errors');
  62. OraScript1.SQL.Add('(phone_6,data_in,adopted,mex,data_out,TYPE,NAME,port_asl,stan,lin,sak,raspred,');
  63. OraScript1.SQL.Add('street,house,house_ndx,flat,req) VALUES');
  64. OraScript1.SQL.Add('(ROWS.phone_6,ROWS.data_in,ROWS.adopted,ROWS.mex,ROWS.data_out,ROWS.TYPE,ROWS.NAME,');
  65. OraScript1.SQL.Add('ROWS.port_asl,ROWS.stan,ROWS.lin,ROWS.sak,ROWS.raspred,ROWS.street,ROWS.house,ROWS.house_ndx,');
  66. OraScript1.SQL.Add('ROWS.flat,ROWS.req);');
  67. OraScript1.SQL.Add('DELETE FROM failures');
  68. OraScript1.SQL.Add('WHERE Months_Between(SYSDATE,data_out) >= 2 AND data_out IS NOT NULL;');
  69. OraScript1.SQL.Add('END LOOP;');
  70. OraScript1.SQL.Add('COMMIT;');
  71. OraScript1.SQL.Add('END;');
  72. OraScript1.Execute;
  73. Result:=True;
  74. except
  75. Result:=False;
  76. end;
  77. end;
  78. end;
  79. Exports ExArhErr,
  80. Connect,
  81. ExArhErr;
  82. begin
  83. end.
  84.  


John Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: John (статус: Посетитель)
Вопрос отправлен: 27 декабря 2007, 05:44
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Косолапов Дмитрий Юрьевич

Здравствуйте, zvialov!
Для начала, в dll-лину передаются String'и, что в корне не верно. PChar в dll надо передавать (и принимать).

Ответ отправил: Косолапов Дмитрий Юрьевич (статус: 8-ой класс)
Время отправки: 27 декабря 2007, 09:00
Оценка за ответ: 3


Мини-форум вопроса

Всего сообщений: 3; последнее сообщение — 27 декабря 2007, 10:41; участников в обсуждении: 2.
John

John (статус: Посетитель), 27 декабря 2007, 10:05 [#1]:

Я сам исправил свою ошибку, может не правильно, кто подскажет?

Я в библиотеке инициализировал создание модуля данных.
begin
Application.CreateForm(TDataModule1, DataModule1);
end.
И еще (отвечая на Отвечает эксперта ) я читал, что в библиотеку можно передавать в качестве параметров строки, но возвращать желательно PChar
Feniks

Feniks (статус: Бакалавр), 27 декабря 2007, 10:33 [#2]:

В DLL в качестве параметров можно передавать/получать строки типа String, НО обязательно надо в блоке uses первым подключать менеджер памяти от борланда, модуль borlndmm. Иначе, в памяти будет твориться бог знает что. Или же передавать/получать PChar.
John

John (статус: Посетитель), 27 декабря 2007, 10:41 [#3]:

Я понимать!
Но библиотека в отладке.
От того что и передавать не измениться. Если не вспомнить, что модуль данных необходимо инициализировать, только потом можно думать, что передавать. То и и слелал, я инициализировал модуль данных. Пепер буду посмотреть как он работает. И что передавать в библиотеку.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:39
Выполнено за 0.02 сек.