├── .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 6 | #include 7 | #include 8 | 9 | #include "BaseNativeAPI.h" 10 | #include "Metadata.h" 11 | 12 | namespace Addin1C { 13 | 14 | class AbstractObjectCreator { 15 | public: 16 | virtual BaseNativeAPI::IComponentBase* create() = 0; 17 | }; 18 | 19 | template 20 | class ConcreteObjectCreator : public AbstractObjectCreator { 21 | public: 22 | BaseNativeAPI::IComponentBase* create() { return new Object; } 23 | }; 24 | 25 | class AddinManager { 26 | public: 27 | ~AddinManager(); 28 | 29 | static AddinManager& getSingleton(void) { 30 | static AddinManager singleton; 31 | return singleton; 32 | } 33 | 34 | template 35 | void registerObject(); 36 | 37 | const WCHAR_T* getClassNames(); 38 | BaseNativeAPI::IComponentBase* createObject(const platformString& className); 39 | 40 | bool ready(); 41 | 42 | private: 43 | std::map mObjects; 44 | 45 | AddinManager() {}; 46 | AddinManager(const AddinManager& root); 47 | AddinManager& operator=(const AddinManager&); 48 | }; 49 | 50 | template 51 | inline void AddinManager::registerObject() { 52 | static bool registered = false; 53 | 54 | if (registered) return; 55 | registered = true; 56 | 57 | mObjects[Object::getName()] = new ConcreteObjectCreator; 58 | } 59 | 60 | } 61 | 62 | #endif // ComponentManager_h__ 63 | -------------------------------------------------------------------------------- /include/AddinObject.h: -------------------------------------------------------------------------------- 1 |  2 | #ifndef _SMART_COMPONENT_BASE_H_ 3 | #define _SMART_COMPONENT_BASE_H_ 4 | 5 | #ifdef _WINDOWS 6 | #include 7 | #endif 8 | 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | 15 | #include "Metadata.h" 16 | #include "Variant.h" 17 | #include "AddinManager.h" 18 | #include "BaseNativeAPI.h" 19 | 20 | #define ADDIN1C_CALL_CONCRETE_ADDIN_MEMBER(member) ((*(ConcreteAddin*)this).*(member)) 21 | 22 | namespace Addin1C { 23 | 24 | template 25 | class AddinObject : public BaseNativeAPI::IComponentBase { 26 | public: 27 | typedef ClassMetadata Metadata; 28 | 29 | AddinObject(); 30 | virtual ~AddinObject() {} 31 | 32 | Variant getErrorDescription(VariantParameters&); 33 | void message(const std::wstring& msg, const long code = 0); 34 | 35 | private: 36 | friend class AddinManager; 37 | 38 | std::wstring mLastErrorDescription; 39 | BaseNativeAPI::IAddInDefBase* mConnect; 40 | BaseNativeAPI::IMemoryManager* mMemoryManager; 41 | 42 | static Metadata& metadata(); 43 | 44 | void handleExternalException(); 45 | 46 | virtual bool ADDIN_API Init(void*); 47 | virtual bool ADDIN_API setMemManager(void* mem); 48 | virtual long ADDIN_API GetInfo(); 49 | virtual void ADDIN_API Done(); 50 | virtual bool ADDIN_API RegisterExtensionAs(WCHAR_T**); 51 | virtual long ADDIN_API GetNProps(); 52 | virtual long ADDIN_API FindProp(const WCHAR_T* wsPropName); 53 | virtual const WCHAR_T* ADDIN_API GetPropName(long lPropNum, long lPropAlias); 54 | virtual bool ADDIN_API GetPropVal(const long lPropNum, BaseNativeAPI::tVariant* pvarPropVal); 55 | virtual bool ADDIN_API SetPropVal(const long lPropNum, BaseNativeAPI::tVariant* varPropVal); 56 | virtual bool ADDIN_API IsPropReadable(const long lPropNum); 57 | virtual bool ADDIN_API IsPropWritable(const long lPropNum); 58 | virtual long ADDIN_API GetNMethods(); 59 | virtual long ADDIN_API FindMethod(const WCHAR_T* wsMethodName); 60 | virtual const WCHAR_T* ADDIN_API GetMethodName(const long lMethodNum, const long lMethodAlias); 61 | virtual long ADDIN_API GetNParams(const long lMethodNum); 62 | virtual bool ADDIN_API GetParamDefValue(const long lMethodNum, const long lParamNum, BaseNativeAPI::tVariant *pvarParamDefValue); 63 | virtual bool ADDIN_API HasRetVal(const long lMethodNum); 64 | virtual bool ADDIN_API CallAsProc(const long lMethodNum, BaseNativeAPI::tVariant* paParams, const long lSizeArray); 65 | virtual bool ADDIN_API CallAsFunc(const long lMethodNum, BaseNativeAPI::tVariant* pvarRetValue, BaseNativeAPI::tVariant* paParams, const long lSizeArray); 66 | virtual void ADDIN_API SetLocale(const WCHAR_T* loc); 67 | }; 68 | 69 | template 70 | ClassMetadata& AddinObject::metadata() { 71 | static Metadata md(ConcreteAddin::getName()); 72 | static bool metadataIsReady = false; 73 | 74 | if (!metadataIsReady) { 75 | ConcreteAddin::getMetadata(md); 76 | md.addFunction(L"ErrorDescription", L"ОписаниеОшибки", 0, &ConcreteAddin::getErrorDescription); 77 | metadataIsReady = true; 78 | } 79 | 80 | return md; 81 | } 82 | 83 | template 84 | void Addin1C::AddinObject::handleExternalException() { 85 | try { 86 | try { 87 | throw; 88 | } catch (std::wstring& errorDescription) { 89 | mLastErrorDescription = errorDescription; 90 | } catch (std::exception& e) { 91 | std::string what = e.what(); 92 | mLastErrorDescription = std::wstring(what.begin(), what.end()); 93 | } catch (...) { 94 | mLastErrorDescription = L""; 95 | } 96 | 97 | message(mLastErrorDescription, 11L); 98 | } catch (...) {} // to suppress bad_alloc on string operations, for example 99 | } 100 | 101 | template 102 | Variant AddinObject::getErrorDescription(VariantParameters&) { 103 | return mLastErrorDescription; 104 | } 105 | 106 | template 107 | AddinObject::AddinObject() 108 | : 109 | mMemoryManager(NULL), 110 | mConnect(NULL) 111 | {} 112 | 113 | template 114 | bool AddinObject::Init(void* pConnection) { 115 | mConnect = (BaseNativeAPI::IAddInDefBase*)pConnection; 116 | return mConnect != NULL; 117 | } 118 | 119 | template 120 | long AddinObject::GetInfo() { 121 | return 2000L; 122 | } 123 | 124 | template 125 | void AddinObject::Done() { 126 | 127 | } 128 | 129 | template 130 | bool AddinObject::RegisterExtensionAs(WCHAR_T** wsExtensionName) { 131 | const platformString& name = metadata().name(); 132 | 133 | size_t bytes = (name.size() + 1) * sizeof(WCHAR_T); 134 | if (!mMemoryManager || !mMemoryManager->AllocMemory((void**)wsExtensionName, bytes)) 135 | return false; 136 | 137 | memcpy(*wsExtensionName, name.c_str(), bytes); 138 | 139 | return true; 140 | } 141 | 142 | template 143 | long AddinObject::GetNProps() { 144 | return metadata().properties().size(); 145 | } 146 | 147 | template 148 | long AddinObject::FindProp(const WCHAR_T* wsPropName) { 149 | auto& props = metadata().properties(); 150 | 151 | for (auto i = 0U; i < props.size(); i++) { 152 | if (isEqualICase(props[i].englishName, wsPropName) 153 | || isEqualICase(props[i].localName, wsPropName)) return i; 154 | } 155 | 156 | return -1; 157 | } 158 | 159 | template 160 | const WCHAR_T* AddinObject::GetPropName(long lPropNum, long lPropAlias) { 161 | auto& props = metadata().properties(); 162 | 163 | if ((unsigned long)lPropNum >= props.size()) return NULL; 164 | 165 | const platformString* name; 166 | if (lPropAlias == 0) 167 | name = &props[lPropNum].englishName; 168 | else 169 | name = &props[lPropNum].localName; 170 | 171 | if (!mMemoryManager) return NULL; 172 | 173 | WCHAR_T* result = NULL; 174 | size_t bytes = (name->size() + 1) * sizeof(WCHAR_T); 175 | if (!mMemoryManager->AllocMemory((void**)&result, bytes)) 176 | return NULL; 177 | 178 | memcpy(result, name->c_str(), bytes); 179 | 180 | return result; 181 | } 182 | 183 | template 184 | bool AddinObject::GetPropVal(const long lPropNum, BaseNativeAPI::tVariant* pvarPropVal) { 185 | auto& props = metadata().properties(); 186 | 187 | if ((unsigned long)lPropNum >= props.size()) return false; 188 | 189 | auto property = props[lPropNum]; 190 | 191 | try { 192 | 193 | packVariant(ADDIN1C_CALL_CONCRETE_ADDIN_MEMBER(property.getter)(), pvarPropVal, mMemoryManager); 194 | 195 | mLastErrorDescription.clear(); 196 | 197 | } catch (...) { 198 | handleExternalException(); 199 | return false; 200 | } 201 | 202 | return true; 203 | } 204 | 205 | template 206 | bool AddinObject::SetPropVal(const long lPropNum, BaseNativeAPI::tVariant *varPropVal) { 207 | auto& props = metadata().properties(); 208 | 209 | if ((unsigned long)lPropNum >= props.size()) return false; 210 | 211 | auto property = props[lPropNum]; 212 | 213 | try { 214 | 215 | ADDIN1C_CALL_CONCRETE_ADDIN_MEMBER(property.setter)(extractVariant(varPropVal)); 216 | 217 | mLastErrorDescription.clear(); 218 | 219 | } catch (...) { 220 | handleExternalException(); 221 | return false; 222 | } 223 | 224 | return true; 225 | } 226 | 227 | template 228 | bool AddinObject::IsPropReadable(const long lPropNum) { 229 | auto& props = metadata().properties(); 230 | 231 | if ((unsigned long)lPropNum >= props.size()) return false; 232 | 233 | return (props[lPropNum].modes & PROP_READABLE) != 0; 234 | } 235 | 236 | template 237 | bool AddinObject::IsPropWritable(const long lPropNum) { 238 | auto& props = metadata().properties(); 239 | 240 | if ((unsigned long)lPropNum >= props.size()) return false; 241 | 242 | return (props[lPropNum].modes & PROP_WRITEABLE) != 0; 243 | } 244 | 245 | template 246 | long AddinObject::GetNMethods() { 247 | return metadata().functions().size(); 248 | } 249 | 250 | template 251 | long AddinObject::FindMethod(const WCHAR_T* wsMethodName) { 252 | auto& funcs = metadata().functions(); 253 | 254 | for (auto i = 0U; i < funcs.size(); i++) { 255 | if (isEqualICase(funcs[i].englishName, wsMethodName) || 256 | isEqualICase(funcs[i].localName, wsMethodName)) return i; 257 | } 258 | 259 | return -1; 260 | } 261 | 262 | template 263 | const WCHAR_T* AddinObject::GetMethodName(const long lMethodNum, const long lMethodAlias) { 264 | auto& funcs = metadata().functions(); 265 | 266 | if ((size_t)lMethodNum >= funcs.size()) return NULL; 267 | 268 | const platformString* name; 269 | if (lMethodAlias == 0) 270 | name = &funcs[lMethodNum].englishName; 271 | else 272 | name = &funcs[lMethodNum].localName; 273 | 274 | if (!mMemoryManager) return NULL; 275 | 276 | WCHAR_T* result; 277 | size_t bytes = (name->size() + 1) * sizeof(WCHAR_T); 278 | if (!mMemoryManager->AllocMemory((void**)&result, bytes)) return NULL; 279 | 280 | memcpy(result, name->c_str(), bytes); 281 | 282 | return result; 283 | } 284 | 285 | template 286 | long AddinObject::GetNParams(const long lMethodNum) { 287 | auto& funcs = metadata().functions(); 288 | 289 | if ((size_t)lMethodNum >= funcs.size()) return 0; 290 | 291 | return funcs[lMethodNum].parametersCount; 292 | } 293 | 294 | template 295 | bool AddinObject::GetParamDefValue(const long lMethodNum, const long lParamNum, BaseNativeAPI::tVariant *pvarParamDefValue) { 296 | if ((size_t)lMethodNum >= metadata().functions().size()) return false; 297 | 298 | if (lParamNum >= metadata().functions()[lMethodNum].parametersCount - metadata().functions()[lMethodNum].optionalParametersCount) { 299 | TV_VT(pvarParamDefValue) = BaseNativeAPI::VTYPE_ERROR; // extractValue will convert this value to Undefined. 300 | } else { 301 | TV_VT(pvarParamDefValue) = BaseNativeAPI::VTYPE_EMPTY; 302 | } 303 | 304 | return true; 305 | } 306 | 307 | template 308 | bool AddinObject::HasRetVal(const long lMethodNum) { 309 | return true; 310 | } 311 | 312 | template 313 | bool AddinObject::CallAsProc(const long lMethodNum, BaseNativeAPI::tVariant* paParams, const long lSizeArray) { 314 | return false; 315 | } 316 | 317 | template 318 | bool AddinObject::CallAsFunc(const long lMethodNum, BaseNativeAPI::tVariant* pvarRetValue, BaseNativeAPI::tVariant* paParams, const long lSizeArray) { 319 | auto& funcs = metadata().functions(); 320 | 321 | if ((size_t)lMethodNum >= funcs.size()) return false; 322 | if (lSizeArray != funcs[lMethodNum].parametersCount) return false; 323 | 324 | try { 325 | 326 | // extract parameters 327 | VariantParameters smartParameters(paParams, lSizeArray); 328 | 329 | // call the handler function 330 | Variant result = ADDIN1C_CALL_CONCRETE_ADDIN_MEMBER(funcs[lMethodNum].method)(smartParameters); 331 | 332 | // pack back parameters (only changed) 333 | smartParameters.pack(paParams, mMemoryManager); 334 | 335 | // pack function result 336 | packVariant(result, pvarRetValue, mMemoryManager); 337 | 338 | mLastErrorDescription.clear(); 339 | 340 | } catch (...) { 341 | handleExternalException(); 342 | return false; 343 | } 344 | 345 | return true; 346 | } 347 | 348 | template 349 | void AddinObject::SetLocale(const WCHAR_T* loc) { 350 | #ifdef _WINDOWS 351 | _wsetlocale(LC_ALL, loc); 352 | #endif 353 | } 354 | 355 | template 356 | bool AddinObject::setMemManager(void* mem) { 357 | mMemoryManager = (BaseNativeAPI::IMemoryManager*)mem; 358 | return mMemoryManager != NULL; 359 | } 360 | 361 | template 362 | void AddinObject::message(const std::wstring& msg, const long code /*= 0*/) { 363 | if (!mConnect) return; 364 | 365 | mConnect->AddError(ADDIN_E_INFO, metadata().name().c_str(), convertStringToPlatform(msg).c_str(), code); 366 | } 367 | 368 | } // namespace Addin1C 369 | 370 | #endif 371 | -------------------------------------------------------------------------------- /include/BaseNativeAPI.h: -------------------------------------------------------------------------------- 1 | 2 | #ifndef BaseNativeAPI_h__ 3 | #define BaseNativeAPI_h__ 4 | 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | namespace Addin1C { 11 | 12 | namespace BaseNativeAPI { 13 | 14 | #include "BaseNativeAPI/ComponentBase.h" 15 | #include "BaseNativeAPI/AddInDefBase.h" 16 | #include "BaseNativeAPI/IMemoryManager.h" 17 | 18 | } // namespace BaseNativeAPI 19 | 20 | typedef WCHAR_T platformChar; 21 | typedef std::basic_string platformString; 22 | 23 | inline platformString convertStringToPlatform(const std::wstring& source) { 24 | #ifdef _WINDOWS 25 | return source; 26 | #else 27 | return platformString(source.cbegin(), source.cend()); 28 | #endif 29 | } 30 | 31 | inline bool isEqualICase(const platformString& l, const platformChar* r) { 32 | #ifdef _WINDOWS 33 | return _wcsicmp(l.c_str(), r) == 0; 34 | #else 35 | if (!r) return false; 36 | 37 | size_t r_size = 0; 38 | for (; r[r_size]; r_size++) {} 39 | 40 | return l.size() == r_size 41 | && std::equal(l.cbegin(), l.cend(), r, 42 | [](std::wstring::value_type l1, platformChar r1) 43 | { return std::towupper(l1) == std::towupper(r1); }); 44 | #endif 45 | } 46 | 47 | } 48 | 49 | #endif // BaseNativeAPI_h__ 50 | -------------------------------------------------------------------------------- /include/BaseNativeAPI/AddInDefBase.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Warning!!! 3 | * DO NOT ALTER THIS FILE! 4 | */ 5 | 6 | #ifndef __ADAPTER_DEF_H__ 7 | #define __ADAPTER_DEF_H__ 8 | #include "types.h" 9 | 10 | //////////////////////////////////////////////////////////////////////////////// 11 | /** 12 | * This class serves as representation of a platform for external 13 | * components External components use it to communicate with a platform. 14 | * 15 | */ 16 | /// Base interface for object components. 17 | class IAddInDefBase 18 | { 19 | public: 20 | virtual ~IAddInDefBase() {} 21 | /// Adds the error message 22 | /** 23 | * @param wcode - error code 24 | * @param source - source of error 25 | * @param descr - description of error 26 | * @param scode - error code (HRESULT) 27 | * @return the result of 28 | */ 29 | virtual bool ADDIN_API AddError(unsigned short wcode, const WCHAR_T* source, 30 | const WCHAR_T* descr, long scode) = 0; 31 | 32 | /// Reads a property value 33 | /** 34 | * @param wszPropName -property name 35 | * @param pVal - value being returned 36 | * @param pErrCode - error code (if any error occured) 37 | * @param errDescriptor - error description (if any error occured) 38 | * @return the result of read. 39 | */ 40 | virtual bool ADDIN_API Read(WCHAR_T* wszPropName, 41 | tVariant* pVal, 42 | long *pErrCode, 43 | WCHAR_T** errDescriptor) = 0; 44 | /// Writes a property value 45 | /** 46 | * @param wszPropName - property name 47 | * @param pVar - new property value 48 | * @return the result of write. 49 | */ 50 | virtual bool ADDIN_API Write(WCHAR_T* wszPropName, 51 | tVariant *pVar) = 0; 52 | 53 | ///Registers profile components 54 | /** 55 | * @param wszProfileName - profile name 56 | * @return the result of 57 | */ 58 | virtual bool ADDIN_API RegisterProfileAs(WCHAR_T* wszProfileName) = 0; 59 | 60 | /// Changes the depth of event buffer 61 | /** 62 | * @param lDepth - new depth of event buffer 63 | * @return the result of 64 | */ 65 | virtual bool ADDIN_API SetEventBufferDepth(long lDepth) = 0; 66 | /// Returns the depth of event buffer 67 | /** 68 | * @return the depth of event buffer 69 | */ 70 | virtual long ADDIN_API GetEventBufferDepth() = 0; 71 | /// Registers external event 72 | /** 73 | * @param wszSource - source of event 74 | * @param wszMessage - event message 75 | * @param wszData - message parameters 76 | * @return the result of 77 | */ 78 | virtual bool ADDIN_API ExternalEvent(WCHAR_T* wszSource, 79 | WCHAR_T* wszMessage, 80 | WCHAR_T* wszData) = 0; 81 | /// Clears event buffer 82 | /** 83 | */ 84 | virtual void ADDIN_API CleanEventBuffer() = 0; 85 | 86 | /// Sets status line contents 87 | /** 88 | * @param wszStatusLine - new status line contents 89 | * @return the result of 90 | */ 91 | virtual bool ADDIN_API SetStatusLine(WCHAR_T* wszStatusLine) = 0; 92 | /// Resets the status line contents 93 | /** 94 | * @return the result of 95 | */ 96 | virtual void ADDIN_API ResetStatusLine() = 0; 97 | }; 98 | 99 | #endif //__ADAPTER_DEF_H__ 100 | -------------------------------------------------------------------------------- /include/BaseNativeAPI/ComponentBase.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Warning!!! 3 | * DO NOT ALTER THIS FILE! 4 | */ 5 | 6 | 7 | #ifndef __COMPONENT_BASE_H__ 8 | #define __COMPONENT_BASE_H__ 9 | 10 | #include "types.h" 11 | //////////////////////////////////////////////////////////////////////////////// 12 | /** 13 | * The given interface is intended for initialization and 14 | * uninitialization of component and its adjustments 15 | */ 16 | /// Interface of component initialization. 17 | class IInitDoneBase 18 | { 19 | public: 20 | virtual ~IInitDoneBase() {} 21 | /// Initializes component 22 | /** 23 | * @param disp - 1C:Enterpise interface 24 | * @return the result of 25 | */ 26 | virtual bool ADDIN_API Init(void* disp) = 0; 27 | /// Sets the memory manager 28 | /* 29 | * @param mem - pointer to memory manager interface. 30 | * @return the result of 31 | */ 32 | virtual bool ADDIN_API setMemManager(void* mem) = 0; 33 | 34 | /// Returns component version 35 | /** 36 | * @return - component version (2000 - version 2) 37 | */ 38 | virtual long ADDIN_API GetInfo() = 0; 39 | 40 | /// Uninitializes component 41 | /** 42 | * Component here should release all consumed resources. 43 | */ 44 | virtual void ADDIN_API Done() = 0; 45 | 46 | }; 47 | /////////////////////////////////////////////////////////////////////////// 48 | /** 49 | * The given interface defines methods that are intented to be used by the Platform 50 | */ 51 | /// Interface describing extension of language. 52 | class ILanguageExtenderBase 53 | { 54 | public: 55 | virtual ~ILanguageExtenderBase(){} 56 | /// Registers language extension 57 | /** 58 | * @param wsExtensionName - extension name 59 | * @return the result of 60 | */ 61 | virtual bool ADDIN_API RegisterExtensionAs(WCHAR_T** wsExtensionName) = 0; 62 | 63 | /// Returns number of component properties 64 | /** 65 | * @return number of properties 66 | */ 67 | virtual long ADDIN_API GetNProps() = 0; 68 | 69 | /// Finds property by name 70 | /** 71 | * @param wsPropName - property name 72 | * @return property index or -1, if it is not found 73 | */ 74 | virtual long ADDIN_API FindProp(const WCHAR_T* wsPropName) = 0; 75 | 76 | /// Returns property name 77 | /** 78 | * @param lPropNum - property index (starting with 0) 79 | * @param lPropAlias - 0 - international alias, 80 | * 1 - russian alias. (International alias is required) 81 | * @return proeprty name or 0 if it is not found 82 | */ 83 | virtual const WCHAR_T* ADDIN_API GetPropName(long lPropNum, 84 | long lPropAlias) = 0; 85 | 86 | /// Returns property value 87 | /** 88 | * @param lPropNum - property index (starting with 0) 89 | * @param pvarPropVal - the pointer to a variable for property value 90 | * @return the result of 91 | */ 92 | virtual bool ADDIN_API GetPropVal(const long lPropNum, 93 | tVariant* pvarPropVal) = 0; 94 | 95 | /// Sets the property value 96 | /** 97 | * @param lPropNum - property index (starting with 0) 98 | * @param varPropVal - the pointer to a variable for property value 99 | * @return the result of 100 | */ 101 | virtual bool ADDIN_API SetPropVal(const long lPropNum, 102 | tVariant* varPropVal) = 0; 103 | 104 | /// Is property readable? 105 | /** 106 | * @param lPropNum - property index (starting with 0) 107 | * @return true if property is readable 108 | */ 109 | virtual bool ADDIN_API IsPropReadable(const long lPropNum) = 0; 110 | 111 | /// Is property writable? 112 | /** 113 | * @param lPropNum - property index (starting with 0) 114 | * @return true if property is writable 115 | */ 116 | virtual bool ADDIN_API IsPropWritable(const long lPropNum) = 0; 117 | 118 | /// Returns number of component methods 119 | /** 120 | * @return number of component methods 121 | */ 122 | virtual long ADDIN_API GetNMethods() = 0; 123 | 124 | /// Finds a method by name 125 | /** 126 | * @param wsMethodName - method name 127 | * @return - method index 128 | */ 129 | virtual long ADDIN_API FindMethod(const WCHAR_T* wsMethodName) = 0; 130 | 131 | /// Returns method name 132 | /** 133 | * @param lMethodNum - method index(starting with 0) 134 | * @param lMethodAlias - 0 - international alias, 135 | * 1 - russian alias. (International alias is required) 136 | * @return method name or 0 if method is not found 137 | */ 138 | virtual const WCHAR_T* ADDIN_API GetMethodName(const long lMethodNum, 139 | const long lMethodAlias) = 0; 140 | 141 | /// Returns number of method parameters 142 | /** 143 | * @param lMethodNum - method index (starting with 0) 144 | * @return number of parameters 145 | */ 146 | virtual long ADDIN_API GetNParams(const long lMethodNum) = 0; 147 | 148 | /// Returns default value of method parameter 149 | /** 150 | * @param lMethodNum - method index(starting with 0) 151 | * @param lParamNum - parameter index (starting with 0) 152 | * @param pvarParamDefValue - the pointer to a variable for default value 153 | * @return the result of 154 | */ 155 | virtual bool ADDIN_API GetParamDefValue(const long lMethodNum, 156 | const long lParamNum, 157 | tVariant *pvarParamDefValue) = 0; 158 | 159 | /// Does the method have a return value? 160 | /** 161 | * @param lMethodNum - method index (starting with 0) 162 | * @return true if the method has a return value 163 | */ 164 | virtual bool ADDIN_API HasRetVal(const long lMethodNum) = 0; 165 | 166 | /// Calls the method as a procedure 167 | /** 168 | * @param lMethodNum - method index (starting with 0) 169 | * @param paParams - the pointer to array of method parameters 170 | * @param lSizeArray - the size of array 171 | * @return the result of 172 | */ 173 | virtual bool ADDIN_API CallAsProc(const long lMethodNum, 174 | tVariant* paParams, 175 | const long lSizeArray) = 0; 176 | 177 | /// Calls the method as a function 178 | /** 179 | * @param lMethodNum - method index (starting with 0) 180 | * @param pvarRetValue - the pointer to returned value 181 | * @param paParams - the pointer to array of method parameters 182 | * @param lSizeArray - the size of array 183 | * @return the result of 184 | */ 185 | virtual bool ADDIN_API CallAsFunc(const long lMethodNum, 186 | tVariant* pvarRetValue, 187 | tVariant* paParams, 188 | const long lSizeArray) = 0; 189 | }; 190 | /////////////////////////////////////////////////////////////////////////// 191 | /** 192 | * This interface is used to change component locale 193 | */ 194 | /// Base interface for component localization. 195 | class LocaleBase 196 | { 197 | public: 198 | virtual ~LocaleBase(){} 199 | /// Changes component locale 200 | /** 201 | * @param loc - new locale (for Windows - rus_RUS, 202 | * for Linux - ru_RU, etc...) 203 | */ 204 | virtual void ADDIN_API SetLocale(const WCHAR_T* loc) = 0; 205 | }; 206 | /////////////////////////////////////////////////////////////////////////// 207 | /** 208 | * The given interface is generalized, for its obligatory inheritance 209 | * in implementing components. 210 | */ 211 | /// Base interface describing object as a set of properties and methods. 212 | class IComponentBase : 213 | public IInitDoneBase, 214 | public ILanguageExtenderBase, 215 | public LocaleBase 216 | { 217 | public: 218 | virtual ~IComponentBase(){} 219 | }; 220 | 221 | /// Announcements of exported functions 222 | /** 223 | * These functions should be implemented that component can be loaded and created. 224 | */ 225 | extern "C" long GetClassObject(const WCHAR_T*, IComponentBase** pIntf); 226 | extern "C" long DestroyObject(IComponentBase** pIntf); 227 | extern "C" const WCHAR_T* GetClassNames(); 228 | 229 | typedef long (*GetClassObjectPtr)(const WCHAR_T* wsName, IComponentBase** pIntf); 230 | typedef long (*DestroyObjectPtr)(IComponentBase** pIntf); 231 | typedef const WCHAR_T* (*GetClassNamesPtr)(); 232 | 233 | #endif //__COMPONENT_BASE_H__ 234 | -------------------------------------------------------------------------------- /include/BaseNativeAPI/IMemoryManager.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Warning!!! 3 | * DO NOT ALTER THIS FILE! 4 | */ 5 | 6 | 7 | #ifndef __IMEMORY_MANAGER_H__ 8 | #define __IMEMORY_MANAGER_H__ 9 | 10 | /////////////////////////////////////////////////////////////////////////////// 11 | /** 12 | * The given class allocates and releases memory for a component 13 | */ 14 | /// Interface representing memory manager. 15 | class IMemoryManager 16 | { 17 | public: 18 | virtual ~IMemoryManager() {} 19 | /// Allocates memory of specified size 20 | /** 21 | * @param pMemory - the double pointer to variable, that will hold newly 22 | * allocated block of memory of NULL if allocation fails. 23 | * @param ulCountByte - memory size 24 | * @return the result of 25 | */ 26 | virtual bool ADDIN_API AllocMemory (void** pMemory, unsigned long ulCountByte) = 0; 27 | /// Releases memory 28 | /** 29 | * @param pMemory - The double pointer to the memory block being released 30 | */ 31 | virtual void ADDIN_API FreeMemory (void** pMemory) = 0; 32 | }; 33 | 34 | #endif //__IMEMORY_MANAGER_H__ 35 | -------------------------------------------------------------------------------- /include/BaseNativeAPI/com.h: -------------------------------------------------------------------------------- 1 | 2 | #ifndef __COM_H__ 3 | #define __COM_H__ 4 | 5 | #if defined(__linux__) || defined(__APPLE__) 6 | #include 7 | #include 8 | #pragma GCC system_header 9 | 10 | typedef long HRESULT; 11 | 12 | #ifdef __GNUC__ 13 | #define STDMETHODCALLTYPE __attribute__ ((__stdcall__)) 14 | #define DECLSPEC_NOTHROW __attribute__ ((nothrow)) 15 | #define STDMETHOD(method) virtual DECLSPEC_NOTHROW HRESULT STDMETHODCALLTYPE method 16 | #else 17 | #define STDMETHODCALLTYPE 18 | #endif 19 | 20 | #define __stdcall STDMETHODCALLTYPE 21 | #define near 22 | #define far 23 | #define CONST const 24 | #define FAR far 25 | 26 | typedef unsigned long DWORD; 27 | typedef int BOOL; 28 | typedef short SHORT; 29 | typedef unsigned char BYTE; 30 | typedef unsigned short WORD; 31 | typedef float FLOAT; 32 | typedef FLOAT *PFLOAT; 33 | typedef BOOL near *PBOOL; 34 | typedef BOOL far *LPBOOL; 35 | typedef BYTE near *PBYTE; 36 | typedef BYTE far *LPBYTE; 37 | typedef int near *PINT; 38 | typedef int far *LPINT; 39 | typedef WORD near *PWORD; 40 | typedef WORD far *LPWORD; 41 | typedef long far *LPLONG; 42 | typedef DWORD near *PDWORD; 43 | typedef DWORD far *LPDWORD; 44 | typedef void far *LPVOID; 45 | typedef CONST void far *LPCVOID; 46 | typedef wchar_t *BSTR; 47 | typedef long SCODE; 48 | typedef int INT; 49 | typedef unsigned int UINT; 50 | typedef unsigned int *PUINT; 51 | typedef wchar_t WCHAR; 52 | typedef wchar_t OLECHAR; 53 | typedef wchar_t *LPOLESTR; 54 | typedef const wchar_t *LPCOLESTR; 55 | typedef DWORD LCID; 56 | typedef PDWORD PLCID; 57 | typedef long LONG; 58 | typedef unsigned long ULONG; 59 | typedef long long LONGLONG; 60 | typedef unsigned long long ULONGLONG; 61 | typedef LONG DISPID; 62 | typedef double DOUBLE; 63 | typedef double DATE; 64 | typedef short VARIANT_BOOL; 65 | typedef void *PVOID; 66 | typedef char CHAR; 67 | typedef unsigned short USHORT; 68 | typedef void *HMODULE; 69 | #define OLESTR(str) L##str 70 | 71 | typedef uuid_t GUID; 72 | typedef uuid_t IID; 73 | typedef uuid_t UUID; 74 | #define REFIID const IID & 75 | #define MAX_PATH 260 76 | 77 | #define IsEqualIID(x,y) uuid_compare((x),(y)) 78 | #ifdef __GNUC__ 79 | #define LoadLibraryA(x) dlopen((x), RTLD_LAZY) 80 | #define FreeLibrary(x) dlclose((x)) 81 | #define GetProcAddress(x, y) dlsym((x), (y)) 82 | #endif //__GNUC__ 83 | 84 | #define E_FAIL 0x80004005L 85 | #define S_OK 0L 86 | #define S_FALSE 1L 87 | #define E_NOINTERFACE 0x80004002L 88 | #define E_NOTIMPL 0x80004001L 89 | #define E_INVALIDARG 0x80070057L 90 | #define E_UNEXPECTED 0x8000FFFFL 91 | #define E_OUTOFMEMORY 0x8007000EL 92 | #define DISP_E_UNKNOWNNAME 0x80020006L 93 | #define DISPID_UNKNOWN ( -1 ) 94 | #define TRUE 1 95 | #define FALSE 0 96 | 97 | typedef long ITypeInfo; 98 | 99 | #if defined (__GNUC__) && !defined (NONAMELESSUNION) 100 | __extension__ /* no named members */ 101 | #endif 102 | union tCY { 103 | __extension__ struct 104 | { 105 | unsigned long Lo; 106 | long Hi; 107 | }; 108 | long long int64; 109 | }; 110 | typedef union tagCY CY; 111 | #define CLSIDFromString(x,y) uuid_parse((x),(unsigned char*)(y)) 112 | 113 | #endif //defined(__linux__) || defined(__APPLE__) 114 | 115 | #endif //__COM_H__ 116 | -------------------------------------------------------------------------------- /include/BaseNativeAPI/types.h: -------------------------------------------------------------------------------- 1 | 2 | #ifndef __CON_TYPES_H__ 3 | #define __CON_TYPES_H__ 4 | 5 | #ifdef _WINDOWS 6 | #include 7 | #endif 8 | 9 | #if __GNUC__ >=3 10 | #pragma GCC system_header 11 | #endif 12 | 13 | #include "com.h" 14 | #include 15 | #include 16 | #include 17 | #include 18 | 19 | #define EXTERN_C extern "C" 20 | 21 | #ifdef __GNUC__ 22 | #define _ANONYMOUS_UNION __extension__ 23 | #define _ANONYMOUS_STRUCT __extension__ 24 | #else 25 | #define _ANONYMOUS_UNION 26 | #define _ANONYMOUS_STRUCT 27 | #endif //__GNUC__ 28 | 29 | #ifdef NONAMELESSUNION 30 | #define __VARIANT_NAME_1 u 31 | #define __VARIANT_NAME_2 iface 32 | #define __VARIANT_NAME_3 str 33 | #define __VARIANT_NAME_4 wstr 34 | #else 35 | #define __VARIANT_NAME_1 36 | #define __VARIANT_NAME_2 37 | #define __VARIANT_NAME_3 38 | #define __VARIANT_NAME_4 39 | #endif //NONAMELESSUNION 40 | 41 | #define RESULT_FROM_ERRNO(x) ((long)(x) <= 0 ? ((long)(x)) \ 42 | : ((long) (((x) & 0x0000FFFF) | (BASE_ERRNO << 16) | 0x80000000))) 43 | 44 | #define ADDIN_E_NONE 1000 45 | #define ADDIN_E_ORDINARY 1001 46 | #define ADDIN_E_ATTENTION 1002 47 | #define ADDIN_E_IMPORTANT 1003 48 | #define ADDIN_E_VERY_IMPORTANT 1004 49 | #define ADDIN_E_INFO 1005 50 | #define ADDIN_E_FAIL 1006 51 | #define ADDIN_E_MSGBOX_ATTENTION 1007 52 | #define ADDIN_E_MSGBOX_INFO 1008 53 | #define ADDIN_E_MSGBOX_FAIL 1009 54 | 55 | #ifndef ADDIN_API 56 | #ifdef _WINDOWS 57 | #define ADDIN_API __stdcall 58 | #else 59 | //#define ADDIN_API __attribute__ ((__stdcall__)) 60 | #define ADDIN_API 61 | #endif //_WINDOWS 62 | #endif //ADDIN_API 63 | 64 | #if defined _WINDOWS 65 | //////////////////////////////////////////////////////////////////////////// 66 | // sized integer types 67 | typedef __int8 int8_t ; ///< 8-bit integer 68 | typedef unsigned __int8 uint8_t ; ///< 8-bit unsigned integer 69 | 70 | typedef __int16 int16_t ; ///< 16-bit integer 71 | typedef unsigned __int16 uint16_t ; ///< 16-bit unsigned integer 72 | 73 | typedef __int32 int32_t ; ///< 32-bit integer 74 | typedef unsigned __int32 uint32_t ; ///< 32-bit unsigned integer 75 | 76 | typedef __int64 int64_t ; ///< 64-bit integer 77 | typedef unsigned __int64 uint64_t ; ///< 64-bit unsigned integer 78 | #else 79 | #include 80 | #endif 81 | #ifdef _WINDOWS 82 | #define WCHAR_T wchar_t 83 | #else 84 | #define WCHAR_T uint16_t 85 | #endif //_WINDOWS 86 | typedef unsigned short TYPEVAR; 87 | enum ENUMVAR 88 | { 89 | VTYPE_EMPTY = 0, 90 | VTYPE_NULL, 91 | VTYPE_I2, //int16_t 92 | VTYPE_I4, //int32_t 93 | VTYPE_R4, //float 94 | VTYPE_R8, //double 95 | VTYPE_DATE, //DATE (double) 96 | VTYPE_TM, //struct tm 97 | VTYPE_PSTR, //struct str string 98 | VTYPE_INTERFACE, //struct iface 99 | VTYPE_ERROR, //int32_t errCode 100 | VTYPE_BOOL, //bool 101 | VTYPE_VARIANT, //struct _tVariant * 102 | VTYPE_I1, //int8_t 103 | VTYPE_UI1, //uint8_t 104 | VTYPE_UI2, //uint16_t 105 | VTYPE_UI4, //uint32_t 106 | VTYPE_I8, //int64_t 107 | VTYPE_UI8, //uint64_t 108 | VTYPE_INT, //int Depends on architecture 109 | VTYPE_UINT, //unsigned int Depends on architecture 110 | VTYPE_HRESULT, //long hRes 111 | VTYPE_PWSTR, //struct wstr 112 | VTYPE_BLOB, //means in struct str binary data contain 113 | VTYPE_CLSID, //UUID 114 | VTYPE_STR_BLOB = 0xfff, 115 | VTYPE_VECTOR = 0x1000, 116 | VTYPE_ARRAY = 0x2000, 117 | VTYPE_BYREF = 0x4000, //Only with struct _tVariant * 118 | VTYPE_RESERVED = 0x8000, 119 | VTYPE_ILLEGAL = 0xffff, 120 | VTYPE_ILLEGALMASKED = 0xfff, 121 | VTYPE_TYPEMASK = 0xfff 122 | } ; 123 | #if defined (__GNUC__) && !defined (NONAMELESSUNION) 124 | __extension__ /* no named members */ 125 | #endif 126 | struct _tVariant 127 | { 128 | _ANONYMOUS_UNION union 129 | { 130 | int8_t i8Val; 131 | int16_t shortVal; 132 | int32_t lVal; 133 | int intVal; 134 | unsigned int uintVal; 135 | int64_t llVal; 136 | uint8_t ui8Val; 137 | uint16_t ushortVal; 138 | uint32_t ulVal; 139 | uint64_t ullVal; 140 | int32_t errCode; 141 | long hRes; 142 | float fltVal; 143 | double dblVal; 144 | bool bVal; 145 | char chVal; 146 | wchar_t wchVal; 147 | DATE date; 148 | IID IDVal; 149 | struct _tVariant *pvarVal; 150 | struct tm tmVal; 151 | _ANONYMOUS_STRUCT struct 152 | { 153 | void* pInterfaceVal; 154 | IID InterfaceID; 155 | } __VARIANT_NAME_2/*iface*/; 156 | _ANONYMOUS_STRUCT struct 157 | { 158 | char* pstrVal; 159 | uint32_t strLen; //count of bytes 160 | } __VARIANT_NAME_3/*str*/; 161 | _ANONYMOUS_STRUCT struct 162 | { 163 | WCHAR_T* pwstrVal; 164 | uint32_t wstrLen; //count of symbol 165 | } __VARIANT_NAME_4/*wstr*/; 166 | } __VARIANT_NAME_1; 167 | uint32_t cbElements; //Dimension for an one-dimensional array in pvarVal 168 | TYPEVAR vt; 169 | }; 170 | typedef struct _tVariant tVariant; 171 | typedef tVariant tVariantArg; 172 | 173 | 174 | #if defined(NONAMELESSUNION) 175 | #define TV_JOIN(X, Y) ((X)->u.Y) 176 | #else 177 | #define TV_JOIN(X, Y) ((X)->Y) 178 | #endif 179 | 180 | #define TV_VT(X) ((X)->vt) 181 | #define TV_ISBYREF(X) (TV_VT(X)&VT_BYREF) 182 | #define TV_ISARRAY(X) (TV_VT(X)&VT_ARRAY) 183 | #define TV_ISVECTOR(X) (TV_VT(X)&VT_VECTOR) 184 | #define TV_NONE(X) TV_I2(X) 185 | 186 | #define TV_UI1(X) TV_JOIN(X, ui8Val) 187 | #define TV_I2(X) TV_JOIN(X, shortVal) 188 | #define TV_I4(X) TV_JOIN(X, lVal) 189 | #define TV_I8(X) TV_JOIN(X, llVal) 190 | #define TV_R4(X) TV_JOIN(X, fltVal) 191 | #define TV_R8(X) TV_JOIN(X, dblVal) 192 | #define TV_I1(X) TV_JOIN(X, i8Val) 193 | #define TV_UI2(X) TV_JOIN(X, ushortVal) 194 | #define TV_UI4(X) TV_JOIN(X, ulVal) 195 | #define TV_UI8(X) TV_JOIN(X, ullVal) 196 | #define TV_INT(X) TV_JOIN(X, intVal) 197 | #define TV_UINT(X) TV_JOIN(X, uintVal) 198 | 199 | #ifdef _WIN64 200 | #define TV_INT_PTR(X) TV_JOIN(X, llVal) 201 | #define TV_UINT_PTR(X) TV_JOIN(X, ullVal) 202 | #else 203 | #define TV_INT_PTR(X) TV_JOIN(X, lVal) 204 | #define TV_UINT_PTR(X) TV_JOIN(X, ulVal) 205 | #endif 206 | 207 | 208 | #define TV_DATE(X) TV_JOIN(X, date) 209 | #define TV_STR(X) TV_JOIN(X, pstrVal) 210 | #define TV_WSTR(X) TV_JOIN(X, pwstrVal) 211 | #define TV_BOOL(X) TV_JOIN(X, bVal) 212 | #define TV_UNKNOWN(X) TV_JOIN(X, pInterfaceVal) 213 | #define TV_VARIANTREF(X) TV_JOIN(X, pvarVal) 214 | 215 | void tVarInit(tVariant* tvar); 216 | 217 | inline 218 | void tVarInit(tVariant* tvar) 219 | { 220 | assert(tvar != NULL); 221 | memset(tvar, 0, sizeof(tVariant)); 222 | TV_VT(tvar) = VTYPE_EMPTY; 223 | } 224 | //----------------------------------------------------------------------------// 225 | // static setter functions... 226 | 227 | #define DATA_SET_BEGIN(data_) \ 228 | tVarInit(data_); 229 | 230 | #define DATA_SET_END(data_, type_) \ 231 | TV_VT(data_) = type_; 232 | 233 | 234 | #define DATA_SET(data_, type_, member_, value_) \ 235 | DATA_SET_BEGIN(data_) \ 236 | TV_JOIN(data_, member_) = value_; \ 237 | DATA_SET_END(data_, type_) 238 | 239 | #define DATA_SET_WITH_CAST(data_, type_, member_, cast_, value_) \ 240 | DATA_SET_BEGIN(data_) \ 241 | TV_JOIN(data_, member_) = cast_ value_; \ 242 | DATA_SET_END(data_, type_) 243 | 244 | #endif //__CON_TYPES_H__ 245 | -------------------------------------------------------------------------------- /include/Metadata.h: -------------------------------------------------------------------------------- 1 | 2 | #ifndef Metadata_h__ 3 | #define Metadata_h__ 4 | 5 | #include "Variant.h" 6 | 7 | #include 8 | 9 | namespace Addin1C { 10 | 11 | const int PROP_READABLE = 1; 12 | const int PROP_WRITEABLE = 2; 13 | 14 | template 15 | class ClassMetadata { 16 | typedef Variant (Object::*ComponentFunction)(VariantParameters&); 17 | typedef void (Object::*ComponentParameterSetter)(Variant); 18 | typedef Variant (Object::*ComponentParameterGetter)(); 19 | 20 | private: 21 | struct Function { 22 | platformString englishName; 23 | platformString localName; 24 | long parametersCount; 25 | long optionalParametersCount; 26 | ComponentFunction method; 27 | }; 28 | struct Property { 29 | platformString englishName; 30 | platformString localName; 31 | int modes; 32 | ComponentParameterSetter setter; 33 | ComponentParameterGetter getter; 34 | }; 35 | 36 | public: 37 | ClassMetadata(const std::wstring& name) { 38 | mName = convertStringToPlatform(name); 39 | } 40 | 41 | void addFunction(const std::wstring& englishName, const std::wstring& localName, long parametersCount, ComponentFunction method, const long optionalParametersCount = 0) { 42 | Function func = { convertStringToPlatform(englishName), convertStringToPlatform(localName), parametersCount, optionalParametersCount, method }; 43 | mFunctions.push_back(func); 44 | } 45 | void addProperty(const std::wstring& englishName, const std::wstring& localName, ComponentParameterSetter setter, ComponentParameterGetter getter, const int modes = PROP_READABLE | PROP_WRITEABLE) { 46 | Property prop = { convertStringToPlatform(englishName), convertStringToPlatform(localName), modes, setter, getter }; 47 | mProperties.push_back(prop); 48 | } 49 | 50 | const platformString& name() { return mName; } 51 | const std::vector& functions() { return mFunctions; } 52 | const std::vector& properties() { return mProperties; } 53 | 54 | private: 55 | platformString mName; 56 | 57 | std::vector mFunctions; 58 | std::vector mProperties; 59 | }; 60 | 61 | } 62 | 63 | #endif // Metadata_h__ 64 | 65 | -------------------------------------------------------------------------------- /include/Variant.h: -------------------------------------------------------------------------------- 1 | 2 | #ifndef SmartVariant_h__ 3 | #define SmartVariant_h__ 4 | 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | #include "BaseNativeAPI.h" 11 | 12 | #define ADD_TYPE_SUPPORT(type) \ 13 | Variant(const type& value) : mContent(new ConcreteContent(value)) {} \ 14 | Variant& operator=(const type& value) { Variant(value).swap(*this); return *this; } \ 15 | operator type() { return getValue(); } 16 | 17 | namespace Addin1C { 18 | 19 | class Variant; 20 | Variant extractVariant(BaseNativeAPI::tVariant* var); 21 | void packVariant(const Variant& svar, BaseNativeAPI::tVariant* var, BaseNativeAPI::IMemoryManager*); 22 | 23 | class Undefined {}; 24 | 25 | class BinaryData { 26 | public: 27 | BinaryData(std::string data) : mData(data) {} 28 | 29 | const std::string& getData() const { return mData;} 30 | private: 31 | std::string mData; 32 | }; 33 | 34 | class Variant { 35 | friend class VariantParameters; 36 | 37 | public: 38 | class BadCast : public std::exception { 39 | virtual const char* what() const throw() { 40 | return ""; 41 | } 42 | }; 43 | 44 | Variant() : mContent(NULL) {} 45 | ~Variant() { delete mContent; } 46 | 47 | ADD_TYPE_SUPPORT(std::string) 48 | ADD_TYPE_SUPPORT(std::wstring) 49 | ADD_TYPE_SUPPORT(long) 50 | ADD_TYPE_SUPPORT(double) 51 | ADD_TYPE_SUPPORT(bool) 52 | ADD_TYPE_SUPPORT(BinaryData) 53 | ADD_TYPE_SUPPORT(Undefined) 54 | 55 | Variant(const Variant& sec) : mContent(sec.mContent ? sec.mContent->clone() : 0) {} 56 | 57 | Variant& operator=(const Variant& sec) { 58 | Variant(sec).swap(*this); 59 | return *this; 60 | } 61 | 62 | bool empty() const { 63 | return !mContent; 64 | } 65 | 66 | const std::type_info& type() const { 67 | return mContent ? mContent->type() : typeid(void); 68 | } 69 | 70 | Variant& swap(Variant& sec) { 71 | std::swap(mContent, sec.mContent); 72 | return *this; 73 | } 74 | 75 | template 76 | T getValue() const { 77 | if (typeid(T) != mContent->type()) throw BadCast(); 78 | return (static_cast*>(mContent))->mValue; 79 | } 80 | 81 | void packTo1cVariant(BaseNativeAPI::tVariant* var, BaseNativeAPI::IMemoryManager* memoryManager) const { 82 | if (mContent) mContent->packTo1cVariant(var, memoryManager); 83 | } 84 | 85 | private: 86 | class Content { 87 | public: 88 | virtual ~Content() {} 89 | 90 | virtual const std::type_info& type() const = 0; 91 | virtual Content* clone() const = 0; 92 | 93 | virtual void packTo1cVariant(BaseNativeAPI::tVariant* var, BaseNativeAPI::IMemoryManager* memoryManager) const = 0; 94 | }; 95 | 96 | template 97 | class ConcreteContent: public Content { 98 | public: 99 | ConcreteContent(const T& value): mValue(value) {} 100 | 101 | virtual const std::type_info& type() const { return typeid(T); } 102 | 103 | virtual ConcreteContent* clone() const { 104 | return new ConcreteContent(mValue); 105 | } 106 | 107 | virtual void packTo1cVariant(BaseNativeAPI::tVariant* var, BaseNativeAPI::IMemoryManager* memoryManager) const; 108 | 109 | T mValue; 110 | }; 111 | 112 | Content* mContent; 113 | }; 114 | 115 | class VariantParameters { 116 | struct VariantWithInitialContent { 117 | Variant variant; 118 | Variant::Content* content; 119 | }; 120 | 121 | std::vector mParameters; 122 | 123 | public: 124 | void pack(BaseNativeAPI::tVariant* baseParameters, BaseNativeAPI::IMemoryManager* manager) { 125 | for (size_t i = 0; i < mParameters.size(); i++) { 126 | if (mParameters[i].variant.mContent != mParameters[i].content) packVariant(mParameters[i].variant, baseParameters + i, manager); 127 | } 128 | } 129 | 130 | VariantParameters(BaseNativeAPI::tVariant* baseParameters, size_t count) 131 | : 132 | mParameters(count) 133 | { 134 | for (size_t i = 0; i < count; i++) { 135 | mParameters[i].variant = extractVariant(baseParameters + i); 136 | mParameters[i].content = mParameters[i].variant.mContent; 137 | } 138 | } 139 | 140 | Variant& operator[](size_t i) { 141 | return mParameters[i].variant; 142 | } 143 | }; 144 | 145 | } 146 | 147 | #endif // SmartVariant_h__ 148 | 149 | -------------------------------------------------------------------------------- /src/AddinManager.cpp: -------------------------------------------------------------------------------- 1 | 2 | #include "AddinManager.h" 3 | 4 | #include 5 | 6 | namespace Addin1C { 7 | 8 | BaseNativeAPI::IComponentBase* AddinManager::createObject(const platformString& name) { 9 | return mObjects.at(name)->create(); 10 | } 11 | 12 | const WCHAR_T* AddinManager::getClassNames() { 13 | static platformString classNames; 14 | classNames.clear(); 15 | classNames.reserve(mObjects.size() * 16); // optional 16 | 17 | for (auto object = mObjects.cbegin(); object != mObjects.cend(); object++) { 18 | classNames += object->first + (WCHAR_T)L'|'; 19 | } 20 | if (!classNames.empty()) classNames.pop_back(); 21 | 22 | return classNames.c_str(); 23 | } 24 | 25 | AddinManager::~AddinManager() { 26 | for (auto object = mObjects.cbegin(); object != mObjects.cend(); object++) { 27 | delete object->second; 28 | } 29 | } 30 | 31 | bool AddinManager::ready() { 32 | return !mObjects.empty(); 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /src/Export.cpp: -------------------------------------------------------------------------------- 1 | 2 | #include "AddinManager.h" 3 | 4 | void addinInitialization(Addin1C::AddinManager& manager); 5 | 6 | extern "C" long GetClassObject(const WCHAR_T* wsName, Addin1C::BaseNativeAPI::IComponentBase** pInterface) { 7 | if(*pInterface) return 0; 8 | 9 | auto& manager = Addin1C::AddinManager::getSingleton(); 10 | if (!manager.ready()) addinInitialization(manager); 11 | 12 | try { 13 | *pInterface = manager.createObject(Addin1C::platformString(wsName)); 14 | } catch (...) { 15 | return 0; 16 | } 17 | 18 | return (long)*pInterface; 19 | } 20 | 21 | extern "C" long DestroyObject(Addin1C::BaseNativeAPI::IComponentBase** pIntf) { 22 | if(!*pIntf) 23 | return -1; 24 | 25 | delete *pIntf; 26 | *pIntf = 0; 27 | return 0; 28 | } 29 | 30 | extern "C" const WCHAR_T* GetClassNames() { 31 | auto& manager = Addin1C::AddinManager::getSingleton(); 32 | if (!manager.ready()) addinInitialization(manager); 33 | 34 | return manager.getClassNames(); 35 | } 36 | -------------------------------------------------------------------------------- /src/Variant.cpp: -------------------------------------------------------------------------------- 1 | 2 | #include "Variant.h" 3 | 4 | #include 5 | 6 | namespace Addin1C { 7 | 8 | Variant extractVariant(BaseNativeAPI::tVariant* var) { 9 | switch (var->vt) { 10 | case BaseNativeAPI::VTYPE_BOOL: 11 | return var->bVal; 12 | case BaseNativeAPI::VTYPE_I2: 13 | case BaseNativeAPI::VTYPE_I4: 14 | case BaseNativeAPI::VTYPE_UI1: 15 | return (long)var->lVal; 16 | case BaseNativeAPI::VTYPE_R4: 17 | case BaseNativeAPI::VTYPE_R8: 18 | return var->dblVal; 19 | case BaseNativeAPI::VTYPE_PWSTR: 20 | return std::wstring(var->pwstrVal, var->pwstrVal + var->wstrLen); 21 | case BaseNativeAPI::VTYPE_ERROR: 22 | case BaseNativeAPI::VTYPE_EMPTY: 23 | return Undefined(); 24 | default: 25 | throw std::runtime_error(""); 26 | } 27 | } 28 | 29 | inline void putStringInVariant(const std::string& str, BaseNativeAPI::tVariant* var, BaseNativeAPI::IMemoryManager* memoryManager) { 30 | char* ptr; 31 | auto size = (str.size() + 1) * sizeof(char); 32 | 33 | if (!memoryManager->AllocMemory((void**)&ptr, size)) { 34 | throw std::bad_alloc(); 35 | } 36 | 37 | std::memcpy(ptr, str.c_str(), size); 38 | 39 | TV_VT(var) = BaseNativeAPI::VTYPE_PSTR; 40 | TV_STR(var) = ptr; 41 | var->strLen = str.size(); 42 | } 43 | 44 | template <> 45 | void Variant::ConcreteContent::packTo1cVariant(BaseNativeAPI::tVariant* var, BaseNativeAPI::IMemoryManager* memoryManager) const { 46 | TV_VT(var) = BaseNativeAPI::VTYPE_R8; 47 | TV_R8(var) = mValue; 48 | } 49 | 50 | template <> 51 | void Variant::ConcreteContent::packTo1cVariant(BaseNativeAPI::tVariant* var, BaseNativeAPI::IMemoryManager* memoryManager) const { 52 | TV_VT(var) = BaseNativeAPI::VTYPE_I4; 53 | TV_I4(var) = mValue; 54 | } 55 | 56 | template <> 57 | void Variant::ConcreteContent::packTo1cVariant(BaseNativeAPI::tVariant* var, BaseNativeAPI::IMemoryManager* memoryManager) const { 58 | TV_VT(var) = BaseNativeAPI::VTYPE_BOOL; 59 | TV_BOOL(var) = mValue; 60 | } 61 | 62 | template <> 63 | void Variant::ConcreteContent::packTo1cVariant(BaseNativeAPI::tVariant* var, BaseNativeAPI::IMemoryManager* memoryManager) const { 64 | WCHAR_T* ptr; 65 | size_t bytes = (mValue.size() + 1) * sizeof(WCHAR_T); 66 | 67 | if (!memoryManager->AllocMemory((void**)&ptr, bytes)) { 68 | throw std::bad_alloc(); 69 | } 70 | 71 | #ifdef _WINDOWS 72 | memcpy(ptr, mValue.c_str(), bytes); 73 | #else 74 | const wchar_t* strPtr = str.c_str(); 75 | for (int i = 0; i < str.size() + 1; i++) { 76 | ptr[i] = strPtr[i]; 77 | } 78 | #endif 79 | 80 | TV_VT(var) = BaseNativeAPI::VTYPE_PWSTR; 81 | TV_WSTR(var) = ptr; 82 | var->wstrLen = mValue.size(); 83 | } 84 | 85 | template <> 86 | void Variant::ConcreteContent::packTo1cVariant(BaseNativeAPI::tVariant* var, BaseNativeAPI::IMemoryManager* memoryManager) const { 87 | putStringInVariant(mValue, var, memoryManager); 88 | } 89 | 90 | template <> 91 | void Variant::ConcreteContent::packTo1cVariant(BaseNativeAPI::tVariant* var, BaseNativeAPI::IMemoryManager* memoryManager) const { 92 | putStringInVariant(mValue.getData(), var, memoryManager); 93 | TV_VT(var) = BaseNativeAPI::VTYPE_BLOB; 94 | } 95 | 96 | template <> 97 | void Variant::ConcreteContent::packTo1cVariant(BaseNativeAPI::tVariant* var, BaseNativeAPI::IMemoryManager* memoryManager) const { 98 | TV_VT(var) = BaseNativeAPI::VTYPE_EMPTY; 99 | } 100 | 101 | template 102 | void Variant::ConcreteContent::packTo1cVariant(BaseNativeAPI::tVariant* var, BaseNativeAPI::IMemoryManager* memoryManager) const { 103 | throw std::runtime_error(""); 104 | } 105 | 106 | void packVariant(const Variant& svar, BaseNativeAPI::tVariant* var, BaseNativeAPI::IMemoryManager* memoryManager) { 107 | svar.packTo1cVariant(var, memoryManager); 108 | } 109 | 110 | } 111 | -------------------------------------------------------------------------------- /src/dllmain.cpp: -------------------------------------------------------------------------------- 1 | // dllmain.cpp : Defines the entry point for the DLL application. 2 | 3 | #include 4 | 5 | BOOL APIENTRY DllMain( HMODULE hModule, 6 | DWORD ul_reason_for_call, 7 | LPVOID lpReserved 8 | ) 9 | { 10 | switch (ul_reason_for_call) 11 | { 12 | case DLL_PROCESS_ATTACH: 13 | case DLL_THREAD_ATTACH: 14 | case DLL_THREAD_DETACH: 15 | case DLL_PROCESS_DETACH: 16 | break; 17 | } 18 | return TRUE; 19 | } 20 | --------------------------------------------------------------------------------