![]() |
![]() |
![]() |
|
v7: C# подключение компоненты DLL загружаемой в 1С7.7 | ☑ | ||
---|---|---|---|---|
0
Joshim
11.07.13
✎
11:41
|
Есть компонента загружаемая в 1С 7.7 методом ЗагрузитьВнешнююКомпоненту(). Вопрос:
Возможно использовать функции этой компоненты в программе написанной на C#? Как подключить DLL и затем вызывать функции компоненты? |
|||
1
ДенисЧ
11.07.13
✎
11:42
|
Как к com-объекту обращайся
|
|||
2
ДенисЧ
11.07.13
✎
11:42
|
подробности в документации
|
|||
3
H A D G E H O G s
11.07.13
✎
11:43
|
(0) Не слушай ДенисЧ. Он вечно чушь несет.
|
|||
4
zladenuw
11.07.13
✎
11:45
|
(2,3) вы как, злой тролль и добрый тролль :)
|
|||
5
H A D G E H O G s
11.07.13
✎
11:46
|
Работать можно, правильно вызывая функцию
CallAsFunc() интерфейса ILanguageExtender |
|||
6
tplink741nd
11.07.13
✎
11:47
|
(5) не знаешь не подсказывай :)
|
|||
7
ДенисЧ
11.07.13
✎
11:48
|
(5) То есть интерфейс можно получить, не подключая компоненту как com-объект? И кто после этого чушь несёт?
|
|||
8
H A D G E H O G s
11.07.13
✎
11:50
|
(7) Ну из твоих слов можно сделать вывод о том, что можно подключить как COM объект и херачить его методы так, как они есть в 1С.
|
|||
9
ДенисЧ
11.07.13
✎
11:51
|
(8) у тебя плохой выводяльщик. Меняй его. Я же сказал про документацию
|
|||
10
tplink741nd
11.07.13
✎
11:51
|
(0)
using System.Runtime.InteropServices; [DllImport("your.dll")] подключение длл в сишарпе public static extern метод который будешь вызывать |
|||
11
H A D G E H O G s
11.07.13
✎
11:54
|
(10) Ты прелестен.
Посмотри любым обзорщиком ресурсов и увидь, что в данной dll в 99% случаев всего 4 экспортные функции. |
|||
12
tplink741nd
11.07.13
✎
11:57
|
(11) а ты что гениальную мысль предложил, уймись уже ради бога :)
|
|||
13
Joshim
11.07.13
✎
11:57
|
(10) вы пробовали? так не работает, пишет функция не найдена(
|
|||
14
Joshim
11.07.13
✎
12:00
|
(5)
делаю импорт DLL, код на C#: [DllImport("Current.dll")] а дальше, как вызвать функцию? |
|||
15
tplink741nd
11.07.13
✎
12:07
|
(14) объяви ее после
public static extern MyFunc и дальше вызывай |
|||
16
tplink741nd
11.07.13
✎
12:08
|
(14)
кури тут http://www.rsdn.ru/article/dotnet/coopdll.xml |
|||
17
H A D G E H O G s
11.07.13
✎
12:12
|
(14) Кури тут
http://www.firststeps.ru/mfc/activex/r.php?31 |
|||
18
H A D G E H O G s
11.07.13
✎
12:13
|
А tplink741nd пусть покурит ковер .
|
|||
19
Serginio1
11.07.13
✎
12:20
|
(14) Ты для начала посмотри как работает ILanguageExteder.
Там может быть никаких функций. Если класс реализует IDispatch то работай через него. Или смотри tlb. |
|||
20
H A D G E H O G s
11.07.13
✎
12:22
|
(19) Как никаких функций?
А как 1С то работает с ВК-шечкой без вот этих вот function RegisterExtensionAs(var bstrExtensionName: WideString): HResult; stdcall; function GetNProps(var plProps: Integer): HResult; stdcall; function FindProp(const bstrPropName: WideString; var plPropNum: Integer): HResult; stdcall; function GetPropName(lPropNum, lPropAlias: Integer; var pbstrPropName: WideString): HResult; stdcall; function GetPropVal(lPropNum: Integer; var pvarPropVal: OleVariant): HResult; stdcall; function SetPropVal(lPropNum: Integer; var varPropVal: OleVariant): HResult; stdcall; function IsPropReadable(lPropNum: Integer; var pboolPropRead: Integer): HResult; stdcall; function IsPropWritable(lPropNum: Integer; var pboolPropWrite: Integer): HResult; stdcall; function GetNMethods(var plMethods: Integer): HResult; stdcall; function FindMethod(const bstrMethodName: WideString; var plMethodNum: Integer): HResult; stdcall; function GetMethodName(lMethodNum, lMethodAlias: Integer; var pbstrMethodName: WideString): HResult; stdcall; function GetNParams(lMethodNum: Integer; var plParams: Integer): HResult; stdcall; function GetParamDefValue(lMethodNum, lParamNum: Integer; var pvarParamDefValue: OleVariant): HResult; stdcall; function HasRetVal(lMethodNum: Integer; var pboolRetValue: Integer): HResult; stdcall; function CallAsProc(lMethodNum: Integer; var paParams: PSafeArray): HResult; stdcall; function CallAsFunc(lMethodNum: Integer; var pvarRetValue: OleVariant; var paParams: PSafeArray): HResult; stdcall; |
|||
21
Serginio1
11.07.13
✎
12:32
|
(20) Это DllImport?
Это методы интерфейса ILanguageExteder Там экспортируются то 4 функции Внутренний сервер автоматизации (InProcServer) - это библиотека (DLL), которая может создавать ОА. Как и любой внутренний COM-сервер, внутренний СА должен экспортировать четыре стандартных функции: function DllRegisterServer: HResult; stdcall; function DllUnregisterServer: HResult; stdcall; function DllGetClassObject(const CLSID, IID: TGUID; var Obj): HResult; stdcall; function DllCanUnloadNow: HResult; stdcall; Все эти функции реализованы в модуле ComServ, поэтому вам просто придётся добавить эти функции в раздел exports проекта. Кратко о назначении этих функций: DllRegisterServer Данная ф-ия вызывается для регистрации библиотеки (DLL) вашего СА в системном реестре. DllUnregisterServer Удаляет все разделы и подразделы в системном реестре, созданные ф-ей DllRegisterServer. DllGetClassObject Получение фабрики класса конкретного COM-класса. ?CLSID - идентификатор создаваемого COM-класса. ?IID - содержит указатель на экземпляр интерфейса, который необходимо получить для объекта фабрики классов. ?Obj - при удачном завершении работы ф-ии, данный параметр содержит указатель на интерфейс фабрики классов, обозначенный параметром IID и способный создавать COM-объекты с типом класса, определённым параметром CLSID. DllCanUnloadNow Проверяет можно ли выгрузить из памяти библиотеку (DLL) данного COM-сервера. Если библиотека не используется ни одним из COM-объектов, то ф-ия возвращает S_TRUE иначе S_FALSE. http://delphiworld.narod.ru/base/com_automation.html |
|||
22
H A D G E H O G s
11.07.13
✎
12:42
|
(21) Итить колотить.
Я об этом говорил в (11). Также я Вангую о том, что у автора нет исходников и ему придется запрfшивать IUnknown, потом ILanguageExteder, потом искать его метод через FindMethod(), потом вызывать уже его через CallAsFunc() по наименному порядковому номеру. |
|||
23
zladenuw
11.07.13
✎
12:46
|
(22) проще свою тогда или не факт?
|
|||
24
H A D G E H O G s
11.07.13
✎
12:53
|
(23) Да не факт.
Хотя (я не знаю как в C#), а вот в Дельфи налюбишься с этим SafeArray, через который параметры херачатся в функции. |
|||
25
Serginio1
11.07.13
✎
13:30
|
(24) Я уже использую для ВК ВК ВК которая загружает Объект Автоматизации поддерживающий ITypeInfo и выполняет все его свойства и методы через IlanguageExtender.
И на Delphi и на C# и не заморачиваюсь ни на какие SafeArray и прочие методы IlanguageExtender http://1c.proclub.ru/modules/mydownloads/personal.php?cid=115&lid=2019 |
|||
26
Joshim
11.07.13
✎
16:57
|
(25) спасибо за информацию, но как это может помочь решить задачу вызова функции dll из c#?
|
|||
27
Joshim
11.07.13
✎
16:59
|
(25) привести типы С# к типам 1С у меня получилось, а вот вызвать функцию я так и не смог
|
|||
28
Serginio1
11.07.13
✎
17:22
|
(27) а какие типы ты привел? Там все равно нужно через динамики работать.
(26) Это поможет использовать C# для ВК без использования внутри IlanguageExtender. Свой совет я уже дал в 19. Иначе получай ссылку на интерфейс IlanguageExtender и работай с ним. вот в этом тебе кстати поможет код из (25) |
|||
29
Serginio1
11.07.13
✎
17:48
|
Можешь посмотреть http://www.rsdn.ru/article/dotnet/cs1c.xml
правда тебе нужен будет обратный процесс |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |