|
|
|
обращение к DataSet через dll
|
|||
|---|---|---|---|
|
#18+
Задача написать DLL обертку для работы с датасетом (используется TADOQuery). Есть внешнее приложение в котором нужно вернуть последовательно строки датасета, для последующей обработки. Работа с датасетом идет через DLL Как сделать обертку для метода ADOQuery.Next ? Т.е. из внешнего приложения код будет такого вида: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2018, 14:21 |
|
||
|
обращение к DataSet через dll
|
|||
|---|---|---|---|
|
#18+
Петр, Пусть указатель на объект TDataset и будет handle. Заменить sql_query.EOF на функцию sql_query_EOF, sql_query.Next на функцию sql_query.Next, и всё - можно все остальное так и оставить. А еще можно - объединить их в одну функцию sql_query_fetch. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2018, 17:12 |
|
||
|
обращение к DataSet через dll
|
|||
|---|---|---|---|
|
#18+
да но как мне правильно объявить этот указатель в DLL, чтобы он был виден во внешнем приложении? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2018, 23:20 |
|
||
|
обращение к DataSet через dll
|
|||
|---|---|---|---|
|
#18+
Петр, импортируй из dll интерфейс. У меня, например, такой интерфейс реализует метод GetNewQuey: Код: pascal 1. 2. Где ICommonQuery выглядит (примерно) так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. Реализация - в соответствии с внутренними особенностями используемых компонентов. Использование (например, заполнение массива aReports): Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Здесь ConnectDataModule - "корневой" интерфейс, импортированный из dll. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2018, 00:04 |
|
||
|
обращение к DataSet через dll
|
|||
|---|---|---|---|
|
#18+
Петрда но как мне правильно объявить этот указатель в DLL, чтобы он был виден во внешнем приложении?Никак не объявить. Его будет возвращать ф-ция set_sql_query. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2018, 03:35 |
|
||
|
обращение к DataSet через dll
|
|||
|---|---|---|---|
|
#18+
YuRockПетрда но как мне правильно объявить этот указатель в DLL, чтобы он был виден во внешнем приложении?Никак не объявить. Его будет возвращать ф-ция set_sql_query. что-то не работает: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2018, 14:47 |
|
||
|
обращение к DataSet через dll
|
|||
|---|---|---|---|
|
#18+
Фэйтл ЭраПетр, импортируй из dll интерфейс. У меня, например, такой интерфейс реализует метод GetNewQuey: Код: pascal 1. 2. т.е. вы возвращаете сразу массив? не работал никогда в "интерфейсом", в данном случае почему именно он используется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2018, 14:52 |
|
||
|
обращение к DataSet через dll
|
|||
|---|---|---|---|
|
#18+
Петр, тебе надо разобраться, что такое интерфейс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2018, 15:25 |
|
||
|
обращение к DataSet через dll
|
|||
|---|---|---|---|
|
#18+
Петрчто-то не работаетт.к. очень много ошибок. 1. Addr не нужен, просто приводи к типу. А то получается указатель на указатель, который ты потом не разадресовываешь. 2. Что за ADOConnection, кто его создает - неизвестно. 3. Твой ErrMessage - это ад какой-то. Ты туда мертвый указатель посылаешь зачастую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2018, 15:38 |
|
||
|
обращение к DataSet через dll
|
|||
|---|---|---|---|
|
#18+
Петр, Зачем это все надо? Для общего развития? Удобно так не будет. Пусть dll лучше возвращает результат, а не буффер из базы данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2018, 15:41 |
|
||
|
обращение к DataSet через dll
|
|||
|---|---|---|---|
|
#18+
YuRockПетрчто-то не работаетт.к. очень много ошибок. 1. Addr не нужен, просто приводи к типу. А то получается указатель на указатель, который ты потом не разадресовываешь. 2. Что за ADOConnection, кто его создает - неизвестно. 3. Твой ErrMessage - это ад какой-то. Ты туда мертвый указатель посылаешь зачастую. ошибок не дает, но значение поля не возвращает. 1. подскажите как правильно, не селен в указателях 2. не весь код прислал. ADOConnection - устанавливает коннект с БД 3. ErrMessage - это не важно зачем надо: надо чтобы из другой программы (язык MQL4) получить последовательность записей запроса Query (select * from table) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2018, 16:17 |
|
||
|
обращение к DataSet через dll
|
|||
|---|---|---|---|
|
#18+
могу привести весь код если надо для теста ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2018, 16:23 |
|
||
|
обращение к DataSet через dll
|
|||
|---|---|---|---|
|
#18+
Петр, 1. Для начала передаешь widestring, а не PWidechar. Pwidechar - ссылкается на string, который может в любое время уничтожиться. 2. Result := Pointer(ADOQuery); 3. Помни про общий менеджер памяти. 4. Сделай все на интерфейсах+widestring, так жить проще. Интерфейсы - это классы, только лучше :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2018, 16:25 |
|
||
|
обращение к DataSet через dll
|
|||
|---|---|---|---|
|
#18+
Петр, 1. Ничего не делай в секциях initialization и finalization - ибо грех это. 2. Multithreaded = true - это тоже важно. 3. CoInitializate - надо наверное тоже сделать, и обратную процедуру не забыть. В чем ошибка-то? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2018, 16:28 |
|
||
|
обращение к DataSet через dll
|
|||
|---|---|---|---|
|
#18+
Петр, Для начала научись передавать просто текст из mql4 в приложение. А потом займись уже Ado. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2018, 16:36 |
|
||
|
обращение к DataSet через dll
|
|||
|---|---|---|---|
|
#18+
итак вроде что-то вырисовывается: Код в принципе заработал. Первый затык был Код: pascal 1. по индексу значение не выдавалось, заменил на Код: pascal 1. тип PWideChar - был выбран не случайно с widestring не работает. значения integer DLL возвращает правильно, символьные возвращает в виде: '??' - похоже в кодировке проблема главный вопрос именно в правильном объявлении TADOQuery - где и как объявлять? на данный момент: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2018, 17:41 |
|
||
|
обращение к DataSet через dll
|
|||
|---|---|---|---|
|
#18+
Петр, передача объекта по ссылке из dll чрезвычайно опасна. Даже изменение опций того же самого компилятора может повлечь трудноуловимые глюки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2018, 17:49 |
|
||
|
обращение к DataSet через dll
|
|||
|---|---|---|---|
|
#18+
Фэйтл ЭраПетр, передача объекта по ссылке из dll чрезвычайно опасна. Даже изменение опций того же самого компилятора может повлечь трудноуловимые глюки. возможно, как тогда решить задачу? Возвращением массива? Хотя тут я тоже не уверен, что получиться его правильно вернуть... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2018, 17:57 |
|
||
|
обращение к DataSet через dll
|
|||
|---|---|---|---|
|
#18+
Петрвозможно, как тогда решить задачу?Мы откуда знаем. Ты ж условие задачи не говоришь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2018, 18:05 |
|
||
|
обращение к DataSet через dll
|
|||
|---|---|---|---|
|
#18+
YuRockПетрвозможно, как тогда решить задачу?Мы откуда знаем. Ты ж условие задачи не говоришь. дважды сказал: 2-я строка первого поста: Есть внешнее приложение в котором нужно вернуть последовательно строки датасета, для последующей обработки. и ниже по тексту: зачем надо: надо чтобы из другой программы (язык MQL4) получить последовательность записей запроса Query (select * from table) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2018, 18:10 |
|
||
|
обращение к DataSet через dll
|
|||
|---|---|---|---|
|
#18+
Петр надо чтобы из другой программы (язык MQL4) В нем точно можно dll подключать? Если да - то что-то вроде 1-го твоего поста. Но только надо изучить, как работать с памятью и все остальное. Как передавать во внешнюю прогу строки и прочее. Буфферы для этого должны быть выделены там, а значит - сначала надо их подготовить, а лишь затем - фетчить записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2018, 21:19 |
|
||
|
обращение к DataSet через dll
|
|||
|---|---|---|---|
|
#18+
Петр надо чтобы из другой программы (язык MQL4) получить последовательность записей запроса Query (select * from table) Что ж ты сразу не сказал про мкл4. Фиг тебе, а не интерфейсы. И, естественно, никаких тебе объектов из dll. Используй какую-нибудь json или xml или csv для возврата структур. Проще всего возвращать все записи сразу. Ибо иначе тебе придется в длл готовить и хранить контекст запроса. Ничего сложного, просто кодить больше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2018, 21:38 |
|
||
|
обращение к DataSet через dll
|
|||
|---|---|---|---|
|
#18+
Фэйтл ЭраИ, естественно, никаких тебе объектов из dll.Стесняюсь спросить, тебе религия мешает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2018, 21:42 |
|
||
|
обращение к DataSet через dll
|
|||
|---|---|---|---|
|
#18+
GatorФэйтл ЭраИ, естественно, никаких тебе объектов из dll.Стесняюсь спросить, тебе религия мешает? Ну расскажи скорее, как объекты Delphi в MQL4 использовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2018, 21:49 |
|
||
|
обращение к DataSet через dll
|
|||
|---|---|---|---|
|
#18+
Фэйтл Эра, Алрес, он и в Африке - адрес. На что он указывает и когда - тебе знать надо (область видимости). Адреc обеспечиваешь ты, как и структуру по этому адресу. Главное, вовремя данные обеспечить и память освободить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2018, 21:59 |
|
||
|
обращение к DataSet через dll
|
|||
|---|---|---|---|
|
#18+
Фэйтл ЭраПетр надо чтобы из другой программы (язык MQL4) получить последовательность записей запроса Query (select * from table) Что ж ты сразу не сказал про мкл4. Фиг тебе, а не интерфейсы. И, естественно, никаких тебе объектов из dll. Используй какую-нибудь json или xml или csv для возврата структур. Проще всего возвращать все записи сразу. Ибо иначе тебе придется в длл готовить и хранить контекст запроса. Ничего сложного, просто кодить больше. На самом деле все работает. Осталась одна проблема: глобальное объявление ADOQuery к которому идет обращение несколько раз пока до дойдем по последней записи. Так вот вопрос если все методы описанные выше сделать в виде интерфейса или класса - будет создаваться свой экземпляр этого объекта в своем разделе памяти? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2018, 22:16 |
|
||
|
обращение к DataSet через dll
|
|||
|---|---|---|---|
|
#18+
Петрбудет создаваться свой экземпляр этого объекта в своем разделе памяти?В каком своем? Не надо его нигде объявлять. Его надо создавать и возвращать функцией создания в основную программу. Как хэндл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2018, 23:14 |
|
||
|
обращение к DataSet через dll
|
|||
|---|---|---|---|
|
#18+
ПетрТак вот вопрос если все методы описанные выше сделать в виде интерфейса или класса - будет создаваться свой экземпляр этого объекта в своем разделе памяти? В "своем". :) Например, такая схема: вызываешь dll метод GetQuery('select ... from ...'), в котором создается TADOQuery и возвращается указатель на него. Далее, для перебора записи используешь, например, метод FetchNext(указатель_на_запрос TADOQuery), который возвращает структуру (xml,json), содержащую текущую запись. Или возвращающую признак EOF, а текущую запись вытягиваешь по отдельному полю, GetField(имя_поля). Не забыть придумать стратегию обработки ошибок: например, когда коннект обломился или поля такого нет. И в конце не забыть вызвать метод разрушения объекта. Ручками, до выгрузки dll. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2018, 23:24 |
|
||
|
обращение к DataSet через dll
|
|||
|---|---|---|---|
|
#18+
Да вы правы, создавать надо из основной программы. Ну какбы вроде все встало на свои места. Обработка исключений - это конечно самое тонкое место. Главная проблема обрыв коннекта. Буду думать Всем спасибо за помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2018, 00:26 |
|
||
|
обращение к DataSet через dll
|
|||
|---|---|---|---|
|
#18+
решил все таки сделать доступ к компонентам ADO через интерфейс и что-то заблудился в двух соснах, при присвоении интерфейсной переменной получаю runtime error. для примера набросал проект. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. Что не так делаю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2019, 13:12 |
|
||
|
обращение к DataSet через dll
|
|||
|---|---|---|---|
|
#18+
Петр, Результат выполнения Create чему то присваиваешь?)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2019, 13:29 |
|
||
|
обращение к DataSet через dll
|
|||
|---|---|---|---|
|
#18+
да затупил Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2019, 13:37 |
|
||
|
обращение к DataSet через dll
|
|||
|---|---|---|---|
|
#18+
Петр, Ты не лез бы пока в интерфейсы, мил человек, с таким то уровнем базовых навыков (прошу без обид), думаешь они тебе чем то помогут? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2019, 13:46 |
|
||
|
обращение к DataSet через dll
|
|||
|---|---|---|---|
|
#18+
для вызова переменной интерфейса через DLL, делаю функцию ее создания в DLL Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. но вызов GetMQLADO из основной программы - опять выдает runtime error Код: pascal 1. 2. 3. 4. 5. 6. что не так делаю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2019, 14:44 |
|
||
|
обращение к DataSet через dll
|
|||
|---|---|---|---|
|
#18+
проблема была в неверном объявлении импортируемой функции правильный вызов: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2019, 15:02 |
|
||
|
обращение к DataSet через dll
|
|||
|---|---|---|---|
|
#18+
тестовый пример работает, коннект устанавливается и разрывается: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. но после закрытия формы основной программы получаю ошибку 'Invalid pointer operation'. Хотя я так понимаю память интерфейсной переменной сама должна была освободиться. Както дополнительно надо ее освобождать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2019, 15:18 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2039946]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 238ms |
| total: | 370ms |

| 0 / 0 |
