Имя: Пароль:
1C
1C 7.7
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
17 H A D G E H O G s
 
11.07.13
12:12
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
правда тебе нужен будет обратный процесс
AdBlock убивает бесплатный контент. 1Сергей