COM InProcServer для MSSQL
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- WadimZapara
- Активист
- Сообщения: 181
- Зарегистрирован: 11 Июнь 2008, 12:11
- Откуда: Тамбов
COM InProcServer для MSSQL
Задача: создать COM-объект на клаше (в DLL) для оперирования через него с DAT-файлами клариона из MSSQL-сервера.
---среда C55ee ---
Прочёл статью Михаила (спасибо, ДП).
Пример Math вызвал некоторые сложности. А именно, на экспортируемую DllCanUnloadNow() компоновщик ругается, будто она дважды объявлена в проекте (делаю через prj).
Вышел из положения, обозвав её DllCanUnloadNoV (проект стал собираться) и подправляя бинарным редактором в готовой DLL имя процедуры.
В системе регистрируется и де-регистрируется с помощью regsvr32.
Тест обращения из клары не писал, попробовал обратиться из из Excel (VB).
Объект не доступен.
Вопросы:
1. Это связано с необходимостью реализации IDispath - интерфейса ?
2. Значит, то же будет и при попытке обращения из MSSQL ?
3. Но тогда нужна и TLB-библиотека ? Как / чем её создать ?
4. Не решал ли кто подобную задачу ?
Помогите...
---среда C55ee ---
Прочёл статью Михаила (спасибо, ДП).
Пример Math вызвал некоторые сложности. А именно, на экспортируемую DllCanUnloadNow() компоновщик ругается, будто она дважды объявлена в проекте (делаю через prj).
Вышел из положения, обозвав её DllCanUnloadNoV (проект стал собираться) и подправляя бинарным редактором в готовой DLL имя процедуры.
В системе регистрируется и де-регистрируется с помощью regsvr32.
Тест обращения из клары не писал, попробовал обратиться из из Excel (VB).
Объект не доступен.
Вопросы:
1. Это связано с необходимостью реализации IDispath - интерфейса ?
2. Значит, то же будет и при попытке обращения из MSSQL ?
3. Но тогда нужна и TLB-библиотека ? Как / чем её создать ?
4. Не решал ли кто подобную задачу ?
Помогите...
Последний раз редактировалось WadimZapara 08 Февраль 2012, 21:59, всего редактировалось 1 раз.
Компьютер имеет то преимущество перед мозгом, что им пользуются...
- Дед Пахом
- Старичок
- Сообщения: 3143
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 11 раз
- Поблагодарили: 32 раза
- Контактная информация:
Re: COM InProcSever для MSSQL
Скачай мой EasyCOMCreator, он и IDispatch поддерживает, и tlb создаёт, и сразу типы регистрирует, и условно бесплатный.
За C55 не скажу, на нем комки создавать не пробовал.
За C55 не скажу, на нем комки создавать не пробовал.
С уважением, ДП
Re: COM InProcSever для MSSQL
Тот пример про который пишут - делался под C6. Там он собирается без проблем, но при попытках вызвать из Net, C++ мои коллеги жаловались что тут что-то не так (не импортиться)
EasyCom creator я после этого опробовал, то что на нем было сделано без проблем подключилось к С++. Далее я проверил что и из программ сделанных на C6 все более -ли менее рвботает (даже через OLE contol недавно я пост сделал про вызовы окошек) Более глубоко не копал пока нет необходимости но видимо технология вполне рабочая.
EasyCom creator я после этого опробовал, то что на нем было сделано без проблем подключилось к С++. Далее я проверил что и из программ сделанных на C6 все более -ли менее рвботает (даже через OLE contol недавно я пост сделал про вызовы окошек) Более глубоко не копал пока нет необходимости но видимо технология вполне рабочая.
- WadimZapara
- Активист
- Сообщения: 181
- Зарегистрирован: 11 Июнь 2008, 12:11
- Откуда: Тамбов
Re: COM InProcSever для MSSQL
Спасибо, Михаил! EasyCOMCreator - это сила, респект!
Тестовый Math под C55 заработал после недолгих танцев с бубном.
А именно:
1) исключение строки INCLUDE('cwutil.inc'),ONCE
2) собственное определение процедур LONGTOHEX (? N), String -И- PathSplit (String FileName, <*CString FileDrive>, <*CString FileDir>, <*CString SmallName>), Byte
3) изменение логики вызова PUTREG, так как в C55ee она возвращает TRUE/FALSE = успех/неудача
4) подключение Equates.clw, Builtins.clw, svapi.inc, svcomdef.inc, winerr.inc из LibSrc от C6
5) самое интересное:
проведение компиляции, сборки со строкой DllCanUnloadNow(),HRESULT,PASCAL, Name('DllCanUnloadNoV') и, соответственно в EXP-файле DllCanUnloadNoV
а затем, редактирование готовой DLL бинарным редактором с превращением DllCanUnloadNoV в DllCanUnloadNow
Из Excel-а окейно работает.
Но вот необходимость пункта 5 вводит в транс.
И вопрос "почему не собирается с именем DllCanUnloadNow с выдачей сообщения об ошибке повторного использования этого имени" остаётся открытым.
Тестовый Math под C55 заработал после недолгих танцев с бубном.
А именно:
1) исключение строки INCLUDE('cwutil.inc'),ONCE
2) собственное определение процедур LONGTOHEX (? N), String -И- PathSplit (String FileName, <*CString FileDrive>, <*CString FileDir>, <*CString SmallName>), Byte
3) изменение логики вызова PUTREG, так как в C55ee она возвращает TRUE/FALSE = успех/неудача
4) подключение Equates.clw, Builtins.clw, svapi.inc, svcomdef.inc, winerr.inc из LibSrc от C6
5) самое интересное:
проведение компиляции, сборки со строкой DllCanUnloadNow(),HRESULT,PASCAL, Name('DllCanUnloadNoV') и, соответственно в EXP-файле DllCanUnloadNoV
а затем, редактирование готовой DLL бинарным редактором с превращением DllCanUnloadNoV в DllCanUnloadNow
Из Excel-а окейно работает.
Но вот необходимость пункта 5 вводит в транс.
И вопрос "почему не собирается с именем DllCanUnloadNow с выдачей сообщения об ошибке повторного использования этого имени" остаётся открытым.
Компьютер имеет то преимущество перед мозгом, что им пользуются...
- Дед Пахом
- Старичок
- Сообщения: 3143
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 11 раз
- Поблагодарили: 32 раза
- Контактная информация:
Re: COM InProcSever для MSSQL
Попробуй выкинуть DllCanUnloadNow из .exp файла, может прокатит?
С уважением, ДП
- WadimZapara
- Активист
- Сообщения: 181
- Зарегистрирован: 11 Июнь 2008, 12:11
- Откуда: Тамбов
Re: COM InProcSever для MSSQL
ды конечно, катит.
так я и танцую с бин.редактором, чтоб функциональность не потерять.
так я и танцую с бин.редактором, чтоб функциональность не потерять.
Компьютер имеет то преимущество перед мозгом, что им пользуются...
- WadimZapara
- Активист
- Сообщения: 181
- Зарегистрирован: 11 Июнь 2008, 12:11
- Откуда: Тамбов
Re: COM InProcSever для MSSQL
способ ?Дед Пахом писал(а):Можно ещё из win32.lib выкинуть.
Компьютер имеет то преимущество перед мозгом, что им пользуются...
- Дед Пахом
- Старичок
- Сообщения: 3143
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 11 раз
- Поблагодарили: 32 раза
- Контактная информация:
Re: COM InProcSever для MSSQL
Ну аккуратненько так в блокноте стереть всё ненужное
В принципе можно, наверно, подсунуть win32.lib от 6-ки/7-ки/8=ки
В принципе можно, наверно, подсунуть win32.lib от 6-ки/7-ки/8=ки
С уважением, ДП
- WadimZapara
- Активист
- Сообщения: 181
- Зарегистрирован: 11 Июнь 2008, 12:11
- Откуда: Тамбов
Re: COM InProcSever для MSSQL
подмена на 6-кину либу не прокатила
в смысле - итог тот же самый
в смысле - итог тот же самый
Компьютер имеет то преимущество перед мозгом, что им пользуются...
- WadimZapara
- Активист
- Сообщения: 181
- Зарегистрирован: 11 Июнь 2008, 12:11
- Откуда: Тамбов
Re: COM InProcServer для MSSQL
то, что выше - не проблема, сделал заменялку имени в DLL-ке.
Дальше - всё гораздо хужеватее:
/ DLL с комом регистрируется в системе, из Excel объект создаётся, методы вызываются. /
В реализацию интерфейса COM включена переменная, ну скажем, XVar, инициализацию провожу в CONSTRUCT.
После создания объекта (CreateObject) вызываю метод без параметров, который возвращает значение переменной XVar.
Не могу объяснить себе - почему в XVar вижу мусор.
C55ee.
ЗЫ: может нужны mutex, critical section ?
Дальше - всё гораздо хужеватее:
/ DLL с комом регистрируется в системе, из Excel объект создаётся, методы вызываются. /
В реализацию интерфейса COM включена переменная, ну скажем, XVar, инициализацию провожу в CONSTRUCT.
После создания объекта (CreateObject) вызываю метод без параметров, который возвращает значение переменной XVar.
Не могу объяснить себе - почему в XVar вижу мусор.
C55ee.
ЗЫ: может нужны mutex, critical section ?
Компьютер имеет то преимущество перед мозгом, что им пользуются...
- Дед Пахом
- Старичок
- Сообщения: 3143
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 11 раз
- Поблагодарили: 32 раза
- Контактная информация:
Re: COM InProcServer для MSSQL
Понаставь стопов в каждый метод, дабы убедиться, что всё вызывается. Проверь заодно прагмы проекта:
#pragma define(_SVDllMode_=>0)
#pragma define(_SVLinkMode_=>1)
#pragma define(_ABCLinkMode_=>1)
и объявление
locCOMIniter CCOMIniter
это автоматом вызывает CoInitialize() в конструкторе.
#pragma define(_SVDllMode_=>0)
#pragma define(_SVLinkMode_=>1)
#pragma define(_ABCLinkMode_=>1)
и объявление
locCOMIniter CCOMIniter
это автоматом вызывает CoInitialize() в конструкторе.
С уважением, ДП
- WadimZapara
- Активист
- Сообщения: 181
- Зарегистрирован: 11 Июнь 2008, 12:11
- Откуда: Тамбов
Re: COM InProcServer для MSSQL
автоматом вызвало только "Illegal data type CCOMINITER"Дед Пахом писал(а): locCOMIniter CCOMIniter
это автоматом вызывает CoInitialize() в конструкторе.
где он описан ?
ЗЫ: C55ee - проект Legacy
Компьютер имеет то преимущество перед мозгом, что им пользуются...
- WadimZapara
- Активист
- Сообщения: 181
- Зарегистрирован: 11 Июнь 2008, 12:11
- Откуда: Тамбов
Re: COM InProcServer для MSSQL
скомпилировалось
пока не катит
да и ещё: в момент, когда в Excel-е выполняется операция OBJ = Nothing - Excel падает с кодом исключения 5, указывая, что ошибка произошла в модуле c55runx.dll
пока не катит
да и ещё: в момент, когда в Excel-е выполняется операция OBJ = Nothing - Excel падает с кодом исключения 5, указывая, что ошибка произошла в модуле c55runx.dll
Компьютер имеет то преимущество перед мозгом, что им пользуются...