├── .gitignore
├── Addin1C.vcxproj
├── Example
├── Build
│ └── packAddin.bat
├── Header.h
├── NativeComponent.vcxproj
└── Source.cpp
├── Exports.def
├── Makefile
├── README.md
├── include
├── AddinManager.h
├── AddinObject.h
├── BaseNativeAPI.h
├── BaseNativeAPI
│ ├── AddInDefBase.h
│ ├── ComponentBase.h
│ ├── IMemoryManager.h
│ ├── com.h
│ └── types.h
├── Metadata.h
└── Variant.h
└── src
├── AddinManager.cpp
├── Export.cpp
├── Variant.cpp
└── dllmain.cpp
/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | MANIFEST.XML
3 | *.zip
4 | *.lib
5 | *.dll
6 |
7 | !ExampleAddin.sln
8 |
9 | Win32
10 | *.sln
11 |
12 | ## VS projects and solutions
13 | #*proj
14 | *.filters
15 |
16 | ## CMake
17 |
18 | CMakeCache.txt
19 | CMakeFiles
20 | # Makefile
21 | cmake_install.cmake
22 | install_manifest.txt
23 |
24 | ## Ignore Visual Studio temporary files, build results, and
25 | ## files generated by popular Visual Studio add-ons.
26 |
27 | # User-specific files
28 | *.suo
29 | *.user
30 | *.sln.docstates
31 |
32 | # Build results
33 |
34 | [Dd]ebug*/
35 | [Rr]elease*/
36 |
37 | #build/
38 |
39 |
40 | [Tt]est[Rr]esult
41 | [Bb]uild[Ll]og.*
42 |
43 | *_i.c
44 | *_p.c
45 | *.ilk
46 | *.meta
47 | *.obj
48 | *.pch
49 | *.pdb
50 | *.pgc
51 | *.pgd
52 | *.rsp
53 | *.sbr
54 | *.tlb
55 | *.tli
56 | *.tlh
57 | *.tmp
58 | *.vspscc
59 | *.vssscc
60 | .builds
61 |
62 | *.pidb
63 |
64 | *.log
65 | *.scc
66 | # Visual C++ cache files
67 | ipch/
68 | *.aps
69 | *.ncb
70 | *.opensdf
71 | *.sdf
72 |
73 | # Visual Studio profiler
74 | *.psess
75 | *.vsp
76 |
77 | # Guidance Automation Toolkit
78 | *.gpState
79 |
80 | # ReSharper is a .NET coding add-in
81 | _ReSharper*/
82 |
83 | *.[Rr]e[Ss]harper
84 |
85 | # NCrunch
86 | *.ncrunch*
87 | .*crunch*.local.xml
88 |
89 | # Installshield output folder
90 | [Ee]xpress
91 |
92 | # DocProject is a documentation generator add-in
93 | DocProject/buildhelp/
94 | DocProject/Help/*.HxT
95 | DocProject/Help/*.HxC
96 | DocProject/Help/*.hhc
97 | DocProject/Help/*.hhk
98 | DocProject/Help/*.hhp
99 | DocProject/Help/Html2
100 | DocProject/Help/html
101 |
102 | # Click-Once directory
103 | publish
104 |
105 | # Publish Web Output
106 | *.Publish.xml
107 |
108 | # Others
109 | [Bb]in
110 | [Oo]bj
111 | sql
112 | TestResults
113 | [Tt]est[Rr]esult*
114 | *.Cache
115 | ClientBin
116 | [Ss]tyle[Cc]op.*
117 | ~$*
118 | *.dbmdl
119 |
120 | *.[Pp]ublish.xml
121 |
122 | Generated_Code #added for RIA/Silverlight projects
123 |
124 | # Backup & report files from converting an old project file to a newer
125 | # Visual Studio version. Backup files are not needed, because we have git ;-)
126 | _UpgradeReport_Files/
127 | Backup*/
128 | UpgradeLog*.XML
129 |
130 | # NuGet
131 | packages/
132 |
--------------------------------------------------------------------------------
/Addin1C.vcxproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | Win32
7 |
8 |
9 | Debug
10 | x64
11 |
12 |
13 | Release
14 | Win32
15 |
16 |
17 | Release
18 | x64
19 |
20 |
21 |
22 | {6C68BE99-ACBB-4F30-B7ED-272ACE4DFEC5}
23 | Win32Proj
24 |
25 |
26 |
27 | StaticLibrary
28 | true
29 | v110
30 |
31 |
32 | StaticLibrary
33 | true
34 | v110
35 |
36 |
37 | StaticLibrary
38 | false
39 | v110
40 |
41 |
42 | StaticLibrary
43 | false
44 | v110
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 | true
64 | $(SolutionDir)Build\
65 | Build\$(Configuration)_$(Platform)\
66 | $(ProjectName)_$(Configuration)_$(Platform)
67 |
68 |
69 | true
70 | $(SolutionDir)Build\
71 | Build\$(Configuration)_$(Platform)\
72 | $(ProjectName)_$(Configuration)_$(Platform)
73 |
74 |
75 | true
76 | $(SolutionDir)Build\
77 | Build\$(Configuration)_$(Platform)\
78 | $(ProjectName)_$(Configuration)_$(Platform)
79 |
80 |
81 | true
82 | $(SolutionDir)Build\
83 | Build\$(Configuration)_$(Platform)\
84 | $(ProjectName)_$(Configuration)_$(Platform)
85 |
86 |
87 |
88 | _WINDOWS;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)
89 | include;%(AdditionalIncludeDirectories)
90 | MultiThreadedDebug
91 | Level3
92 | ProgramDatabase
93 | Disabled
94 |
95 |
96 | MachineX86
97 | true
98 | Windows
99 |
100 |
101 |
102 |
103 | _WINDOWS;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)
104 | include;%(AdditionalIncludeDirectories)
105 | MultiThreadedDebug
106 | Level3
107 | ProgramDatabase
108 | Disabled
109 |
110 |
111 | true
112 | Windows
113 |
114 |
115 |
116 |
117 | _WINDOWS;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)
118 | include;%(AdditionalIncludeDirectories)
119 | MultiThreaded
120 | Level3
121 | ProgramDatabase
122 |
123 |
124 | MachineX86
125 | true
126 | Windows
127 | true
128 | true
129 |
130 |
131 |
132 |
133 | _WINDOWS;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)
134 | include;%(AdditionalIncludeDirectories)
135 | MultiThreaded
136 | Level3
137 | ProgramDatabase
138 |
139 |
140 | true
141 | Windows
142 | true
143 | true
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
--------------------------------------------------------------------------------
/Example/Build/packAddin.bat:
--------------------------------------------------------------------------------
1 | @echo off
2 |
3 | SET WinRARLocation=
4 | SET DLLsPrefix=%1
5 |
6 | cd Build
7 |
8 | IF "%DLLsPrefix%"=="" (
9 | ECHO Specify addin name!
10 | EXIT /B 2
11 | )
12 |
13 | CALL :CheckForWinRAR "%ProgramFiles%\WinRAR"
14 | CALL :CheckForWinRAR "%ProgramW6432%\WinRAR"
15 | IF NOT EXIST %WinRARLocation%\WinRAR.exe (
16 | ECHO Unable to find WinRAR!
17 | EXIT /B 1
18 | )
19 |
20 |
21 | IF NOT EXIST "MANIFEST.XML" (
22 | ECHO Creating manifest.xml...
23 | ECHO ^ > MANIFEST.XML
24 | ECHO ^ >> MANIFEST.XML
25 | ECHO ^ >> MANIFEST.XML
26 | ECHO ^ >> MANIFEST.XML
27 | ECHO ^ >> MANIFEST.XML
28 | )
29 |
30 | SET AddinFiles=
31 | IF EXIST "%DLLsPrefix%_Release_Win32.dll" SET AddinFiles=%AddinFiles% %DLLsPrefix%_Release_Win32.dll
32 | IF EXIST "%DLLsPrefix%_Release_x64.dll" SET AddinFiles=%AddinFiles% %DLLsPrefix%_Release_x64.dll
33 |
34 | %WinRARLocation%\WinRAR.exe u -afzip -idq -m0 %DLLsPrefix%.zip %AddinFiles% MANIFEST.XML
35 | GOTO ENDOFSCRIPT
36 |
37 | :: Subroutines
38 | :CheckForWinRAR
39 | IF NOT EXIST %WinRARLocation%\WinRAR.exe (
40 | SET WinRARLocation="%~1"
41 | )
42 |
43 | :ENDOFSCRIPT
--------------------------------------------------------------------------------
/Example/Header.h:
--------------------------------------------------------------------------------
1 |
2 | #include
3 |
4 | class Calculator : public Addin1C::AddinObject {
5 | bool property;
6 |
7 | public:
8 | Calculator() : property(false) {}
9 |
10 | static void getMetadata(Metadata& md) {
11 | md.addFunction(L"Multiply5", L"УмножитьНа5", 1, &Calculator::multiply);
12 | md.addFunction(L"ReverseString", L"РазвернутьСтроку", 1, &Calculator::reverseString);
13 | md.addProperty(L"Property", L"Свойство", &Calculator::setProperty, &Calculator::getProperty);
14 | }
15 |
16 | static std::wstring getName() {
17 | return L"Calculator";
18 | }
19 |
20 | void setProperty(Addin1C::Variant value) { property = value; }
21 | Addin1C::Variant getProperty() { return property; }
22 |
23 | Addin1C::Variant multiply(Addin1C::VariantParameters& p) {
24 | long num = p[0];
25 | return num * 5;
26 | }
27 |
28 | Addin1C::Variant reverseString(Addin1C::VariantParameters& p) {
29 | std::wstring str = p[0];
30 | return std::wstring(str.crbegin(), str.crend());
31 | }
32 | };
33 |
34 |
35 | class Keeper : public Addin1C::AddinObject {
36 | long property;
37 |
38 | public:
39 | Keeper() : property(3) {}
40 |
41 | static void getMetadata(Metadata& md) {
42 | md.addProperty(L"Num", L"Число", &Keeper::setProperty, &Keeper::getProperty);
43 | }
44 |
45 | static std::wstring getName() {
46 | return L"Keeper";
47 | }
48 |
49 | void setProperty(Addin1C::Variant value) { property = value; }
50 | Addin1C::Variant getProperty() { return property; }
51 | };
52 |
--------------------------------------------------------------------------------
/Example/NativeComponent.vcxproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | Win32
7 |
8 |
9 | Debug
10 | x64
11 |
12 |
13 | Release
14 | Win32
15 |
16 |
17 | Release
18 | x64
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 | {5A975B87-0582-4373-B45C-78BEA48EEA7A}
29 | Win32Proj
30 | NativeComponent
31 | ExampleAddin
32 |
33 |
34 |
35 | DynamicLibrary
36 | true
37 | v110
38 | Unicode
39 |
40 |
41 | DynamicLibrary
42 | true
43 | v110
44 | Unicode
45 |
46 |
47 | DynamicLibrary
48 | false
49 | v110
50 | true
51 | Unicode
52 |
53 |
54 | DynamicLibrary
55 | false
56 | v110
57 | true
58 | Unicode
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 | false
78 | $(SolutionDir)Build\
79 | Build\$(Configuration)_$(Platform)\
80 | $(ProjectName)_$(Configuration)_$(Platform)
81 |
82 |
83 | false
84 | $(SolutionDir)Build\
85 | Build\$(Configuration)_$(Platform)\
86 | $(ProjectName)_$(Configuration)_$(Platform)
87 |
88 |
89 | false
90 | $(SolutionDir)Build\
91 | Build\$(Configuration)_$(Platform)\
92 | $(ProjectName)_$(Configuration)_$(Platform)
93 |
94 |
95 | false
96 | $(SolutionDir)Build\
97 | Build\$(Configuration)_$(Platform)\
98 | $(ProjectName)_$(Configuration)_$(Platform)
99 |
100 |
101 |
102 |
103 |
104 | Level3
105 | Disabled
106 | WIN32;_DEBUG;_WINDOWS;_USRDLL;NATIVECOMPONENT_EXPORTS;%(PreprocessorDefinitions)
107 | ..\include;%(AdditionalIncludeDirectories)
108 | MultiThreadedDebug
109 | false
110 |
111 |
112 | Windows
113 | true
114 | $(SolutionDir)Build;C:\Devel\Boost\stage\lib;%(AdditionalLibraryDirectories)
115 | Addin1C_$(Configuration)_$(Platform).lib;%(AdditionalDependencies)
116 | ..\Exports.def
117 | $(IntDir)$(TargetName).pgd
118 | $(IntDir)$(TargetName).lib
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 | Level3
130 | Disabled
131 | WIN32;_DEBUG;_WINDOWS;_USRDLL;NATIVECOMPONENT_EXPORTS;%(PreprocessorDefinitions)
132 | ..\include;%(AdditionalIncludeDirectories)
133 | MultiThreadedDebug
134 | false
135 |
136 |
137 | Windows
138 | true
139 | $(SolutionDir)Build;C:\Devel\Boost\stage64\lib;%(AdditionalLibraryDirectories)
140 | Addin1C_$(Configuration)_$(Platform).lib;%(AdditionalDependencies)
141 | ..\Exports.def
142 | $(IntDir)$(TargetName).pgd
143 | $(IntDir)$(TargetName).lib
144 |
145 |
146 | Build\packAddin.bat $(ProjectName)_$(Configuration)
147 |
148 |
149 |
150 |
151 | Level3
152 |
153 |
154 | MaxSpeed
155 | true
156 | true
157 | WIN32;NDEBUG;_WINDOWS;_USRDLL;NATIVECOMPONENT_EXPORTS;%(PreprocessorDefinitions)
158 | ..\include;%(AdditionalIncludeDirectories)
159 | MultiThreaded
160 |
161 |
162 | Windows
163 | true
164 | true
165 | true
166 | $(SolutionDir)Build;C:\Devel\Boost\stage\lib;%(AdditionalLibraryDirectories)
167 | Addin1C_$(Configuration)_$(Platform).lib;%(AdditionalDependencies)
168 | ..\Exports.def
169 | $(IntDir)$(TargetName).pgd
170 | $(IntDir)$(TargetName).lib
171 |
172 |
173 | Build\packAddin.bat $(ProjectName)
174 |
175 |
176 |
177 |
178 | Level3
179 |
180 |
181 | MaxSpeed
182 | true
183 | true
184 | WIN32;NDEBUG;_WINDOWS;_USRDLL;NATIVECOMPONENT_EXPORTS;%(PreprocessorDefinitions)
185 | ..\include;%(AdditionalIncludeDirectories)
186 | MultiThreaded
187 |
188 |
189 | Windows
190 | true
191 | true
192 | true
193 | $(SolutionDir)Build;C:\Devel\Boost\stage64\lib;%(AdditionalLibraryDirectories)
194 | Addin1C_$(Configuration)_$(Platform).lib;%(AdditionalDependencies)
195 | ..\Exports.def
196 | $(IntDir)$(TargetName).pgd
197 | $(IntDir)$(TargetName).lib
198 |
199 |
200 | Build\packAddin.bat $(ProjectName)
201 |
202 |
203 |
204 |
205 |
206 |
--------------------------------------------------------------------------------
/Example/Source.cpp:
--------------------------------------------------------------------------------
1 |
2 | #include "Header.h"
3 |
4 | void addinInitialization(Addin1C::AddinManager& manager) {
5 | manager.registerObject();
6 | manager.registerObject();
7 | }
--------------------------------------------------------------------------------
/Exports.def:
--------------------------------------------------------------------------------
1 | EXPORTS
2 | GetClassObject
3 | DestroyObject
4 | GetClassNames
5 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 |
2 |
3 | TARGET=q.so
4 |
5 | SOURCES=src/AddinManager.cpp src/Export.cpp src/Variant.cpp Example/Source.cpp
6 |
7 | LIBS=pthread
8 |
9 | OBJECTS=$(SOURCES:.cpp=.o)
10 | INCLUDES=-Iinclude
11 | CXXLAGS=$(CXXFLAGS) $(INCLUDES) -fPIC -std=c++11
12 |
13 | all: $(TARGET)
14 |
15 | -include $(OBJECTS:.o=.d)
16 |
17 | %.o: %.cpp
18 | g++ -c $(CXXLAGS) $*.cpp -o $*.o
19 | g++ -MM $(CXXLAGS) $*.cpp > $*.d
20 | @mv -f $*.d $*.d.tmp
21 | @sed -e 's|.*:|$*.o:|' < $*.d.tmp > $*.d
22 | @sed -e 's/.*://' -e 's/\\$$//' < $*.d.tmp | fmt -1 | \
23 | sed -e 's/^ *//' -e 's/$$/:/' >> $*.d
24 | @rm -f $*.d.tmp
25 |
26 | $(TARGET): $(OBJECTS) Makefile
27 | g++ $(CXXLAGS) -shared $(OBJECTS) -o $(TARGET) $(addprefix -l, $(LIBS))
28 |
29 | clean:
30 | -rm $(TARGET) *.o *.d
31 |
32 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | Эта библиотека является враппером для интерфейса компонент, использующих технологию NativeAPI, для платформы 1С:Предприятия 8.x.
2 |
3 | Каталог Example содержит **пример компоненты**. Его можно взять за основу создания своего AddIn'а.
4 |
5 | Использование:
6 | Для определения класса, публикующегося компонентой, необходимо определить класс-наследник шаблонного класса AddinObject, указав в качестве его параметра шаблона имя определяемого класса. Класс должен содержать статическую функию getMetadata, в которой компонента описывает свой интерфейс, состоящий из методов и свойств.
7 | Пример маленького класса:
8 |
9 | ```c++
10 | #include
11 |
12 | class Multiplier : public Addin1C::AddinObject {
13 | public:
14 | static void getMetadata(Metadata& md) {
15 | md.addFunction(L"Multiply5", L"УмножитьНа5", 1, &Multiplier::MultiplyWith5);
16 | }
17 |
18 | static std::wstring getName() {
19 | return L"Calculator";
20 | }
21 |
22 | Addin1C::Variant MultiplyWith5(Addin1C::VariantParameters& parameters) {
23 | long param = parameters[0];
24 |
25 | return param * 5;
26 | }
27 | };
28 | ```
29 |
30 | Обязательными для реализация являются статические методы getMetadata и getName.
31 |
32 | Кроме определения класса, необходимо определить функцию addinInitialization, выглядеть которая должна примерно так:
33 | ```c++
34 | void addinInitialization(Addin1C::AddinManager& manager) {
35 | manager.registerObject();
36 | }
37 | ```
38 |
39 | Перечисленные в ней классы будут доступны для создания в коде 1С.
40 |
41 | Для передачи значений используется тип Addin1C::Variant.
42 | Поддерживаемые типы данных в объекте Addin1C::Variant:
43 | bool - булево
44 | long - число (целое)
45 | double - число (дробное)
46 | string* - строка
47 | wstring - строка
48 | Undefined - неопределено
49 | BinaryData* - ДвоичныеДанные
50 | * - только в направлении [компонента -> 1С].
51 |
52 | Получение значения из этого объекта осуществляется с помощью шаблонного метода getValue<тип> (или преобразования). Если объект содержит значение другого типа, будет сгенерированно исключение BadCast.
53 | Получить идентификатор типа, хранящегося в объекте Variant, можно с помощью метода type.
54 |
55 | VariantParameters - это коллекция значений Variant. В нем всегда ровно столько значений, сколько было указано при заполнении метаданных. Функция может изменить значение своих аргументов, все параметры передаются "по ссылке".
56 | По-умолчанию все параметры считаются обязательными. Можно определить часть параметров метода необязательными, указав 5-м аргументом функции addFunction их количество. Необязательными могут быть только последние параметры метода. В случае, если в коде на встроенном языке 1С какие-то параметры будут опущены, в качестве их значения компонента получит объект Undefined.
57 |
58 | Использование компоненты в коде 1С: Предприятие
59 | ===============================================
60 | ```
61 | ЛюбоеИмяКомпоненты = "ЛюбоеИмяКомпоненты";
62 | Если НЕ ПодключитьВнешнююКомпоненту(ПутьККомпонентеИлиМакетуСНей, ЛюбоеИмяКомпоненты, ТипВнешнейКомпоненты.Native) Тогда
63 | ВызватьИсключение "Подключить компоненту не удалось!";
64 | КонецЕсли;
65 |
66 | Объект = Новый("AddIn." + ЛюбоеИмяКомпоненты + ".ИмяОбъекта"); // ИмяОбъекта - возвращаемая getName() строка
67 |
68 | Попытка
69 | Результат = Объект.РазвернутьСтроку("Тестовая строка");
70 | Исключение
71 | ВызватьИсключение ОписаниеОшибки() + ": " + Компонента.ОписаниеОшибки();
72 | КонецПопытки;
73 | ```
74 |
--------------------------------------------------------------------------------
/include/AddinManager.h:
--------------------------------------------------------------------------------
1 |
2 | #ifndef ComponentManager_h__
3 | #define ComponentManager_h__
4 |
5 | #include