Страница 1 из 3
COM InProcServer для MSSQL
Добавлено: 05 Февраль 2012, 2:33
WadimZapara
Задача: создать COM-объект на клаше (в DLL) для оперирования через него с DAT-файлами клариона из MSSQL-сервера.
---среда C55ee ---
Прочёл статью Михаила (спасибо, ДП).
Пример Math вызвал некоторые сложности. А именно, на экспортируемую DllCanUnloadNow() компоновщик ругается, будто она дважды объявлена в проекте (делаю через prj).
Вышел из положения, обозвав её DllCanUnloadNoV (проект стал собираться) и подправляя бинарным редактором в готовой DLL имя процедуры.
В системе регистрируется и де-регистрируется с помощью regsvr32.
Тест обращения из клары не писал, попробовал обратиться из из Excel (VB).
Объект не доступен.
Вопросы:
1. Это связано с необходимостью реализации IDispath - интерфейса ?
2. Значит, то же будет и при попытке обращения из MSSQL ?
3. Но тогда нужна и TLB-библиотека ? Как / чем её создать ?
4. Не решал ли кто подобную задачу ?
Помогите...
Re: COM InProcSever для MSSQL
Добавлено: 05 Февраль 2012, 10:00
Дед Пахом
Скачай мой
EasyCOMCreator, он и IDispatch поддерживает, и tlb создаёт, и сразу типы регистрирует, и условно бесплатный.
За C55 не скажу, на нем комки создавать не пробовал.
Re: COM InProcSever для MSSQL
Добавлено: 05 Февраль 2012, 14:55
seawolf
Тот пример про который пишут - делался под C6. Там он собирается без проблем, но при попытках вызвать из Net, C++ мои коллеги жаловались что тут что-то не так (не импортиться)
EasyCom creator я после этого опробовал, то что на нем было сделано без проблем подключилось к С++. Далее я проверил что и из программ сделанных на C6 все более -ли менее рвботает (даже через OLE contol недавно я пост сделал про вызовы окошек) Более глубоко не копал пока нет необходимости но видимо технология вполне рабочая.
Re: COM InProcSever для MSSQL
Добавлено: 05 Февраль 2012, 18:56
WadimZapara
Спасибо, Михаил! 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 с выдачей сообщения об ошибке повторного использования этого имени" остаётся открытым.
Re: COM InProcSever для MSSQL
Добавлено: 05 Февраль 2012, 19:14
Дед Пахом
Попробуй выкинуть DllCanUnloadNow из .exp файла, может прокатит?
Re: COM InProcSever для MSSQL
Добавлено: 05 Февраль 2012, 20:01
WadimZapara
ды конечно, катит.
так я и танцую с бин.редактором, чтоб функциональность не потерять.
Re: COM InProcSever для MSSQL
Добавлено: 05 Февраль 2012, 20:16
Дед Пахом
Можно ещё из win32.lib выкинуть.
Re: COM InProcSever для MSSQL
Добавлено: 05 Февраль 2012, 20:48
WadimZapara
Дед Пахом писал(а):Можно ещё из win32.lib выкинуть.
способ ?
Re: COM InProcSever для MSSQL
Добавлено: 05 Февраль 2012, 21:15
Дед Пахом
Ну аккуратненько так в блокноте стереть всё ненужное

В принципе можно, наверно, подсунуть win32.lib от 6-ки/7-ки/8=ки
Re: COM InProcSever для MSSQL
Добавлено: 07 Февраль 2012, 20:24
WadimZapara
подмена на 6-кину либу не прокатила
в смысле - итог тот же самый
Re: COM InProcServer для MSSQL
Добавлено: 10 Февраль 2012, 15:17
WadimZapara
то, что выше - не проблема, сделал заменялку имени в DLL-ке.
Дальше - всё гораздо хужеватее:
/ DLL с комом регистрируется в системе, из Excel объект создаётся, методы вызываются. /
В реализацию интерфейса COM включена переменная, ну скажем, XVar, инициализацию провожу в CONSTRUCT.
После создания объекта (CreateObject) вызываю метод без параметров, который возвращает значение переменной XVar.
Не могу объяснить себе - почему в XVar вижу мусор.
C55ee.
ЗЫ: может нужны mutex, critical section ?
Re: COM InProcServer для MSSQL
Добавлено: 10 Февраль 2012, 15:50
Дед Пахом
Понаставь стопов в каждый метод, дабы убедиться, что всё вызывается. Проверь заодно прагмы проекта:
#pragma define(_SVDllMode_=>0)
#pragma define(_SVLinkMode_=>1)
#pragma define(_ABCLinkMode_=>1)
и объявление
locCOMIniter CCOMIniter
это автоматом вызывает CoInitialize() в конструкторе.
Re: COM InProcServer для MSSQL
Добавлено: 10 Февраль 2012, 16:59
WadimZapara
Дед Пахом писал(а):
locCOMIniter CCOMIniter
это автоматом вызывает CoInitialize() в конструкторе.
автоматом вызвало только "Illegal data type CCOMINITER"
где он описан ?
ЗЫ: C55ee - проект Legacy
Re: COM InProcServer для MSSQL
Добавлено: 10 Февраль 2012, 17:02
Дед Пахом
Объявлен в svcom.inc
Re: COM InProcServer для MSSQL
Добавлено: 10 Февраль 2012, 17:56
WadimZapara
скомпилировалось
пока не катит
да и ещё: в момент, когда в Excel-е выполняется операция OBJ = Nothing - Excel падает с кодом исключения 5, указывая, что ошибка произошла в модуле c55runx.dll