Как сделать dll для excel?

Здравствуйте, я ищу информацию о том, как и с помощью инструмента witch, создать DLL для работы с системой 64, которая будет использоваться для отправки строки данных в ячейку Excel. Dll для использования во внешнем приложении, которое должно отправлять данные в Excel.

Я много кодировал в VBA, но ни один на C или другом языке.

Dll для получения в качестве ввода — Имя файла Excel — Имя листа Excel — Адрес ячейки — Строковое значение Вопросы: — Какое программное обеспечение / компилятор мне нужно — Где я могу получить библиотеку Office Дополнительный вопрос: Является ли DLL в 64-битной версии, которая сможет разговаривать с My Excel в 32 бит. Excel не является вызывающим, он получит только информацию, которую он отправил ему. Любая помощь приветствовала Мартина 🙂 P.S. Надеюсь, я достаточно ясен в своем не очень хорошем английском и совершенно не знаю о предмете dll

Как сделать dll для excel?

Для настоящей DLL я бы сказал, что вам нужно использовать C. Вы можете создать DLL-файл типа ActiveX с VB. Сделайте поиск в Интернете для таких фраз, как создание файлов DLL. Создание файлов dll. VB и / или создание файлов dll.

С каким приложением вам придется использовать DLL? Если это одно из приложений Microsoft Office, таких как Word, Outlook и т.

Д., Вы должны иметь возможность использовать VBA и автоматизацию в нем для передачи информации в Excel. Существует бесплатный пакет Visual C: http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-cpp-express, но я не использовал его и не знаю, поддерживает создание файлов DLL или нет. Но это может быть недорогой инструмент обучения!

Для настоящей DLL я бы сказал, что вам нужно использовать C. Вы можете создать DLL-файл типа ActiveX с VB. Сделайте поиск в Интернете для таких фраз, как создание файлов DLL. Создание файлов dll. VB и / или создание файлов dll.

С каким приложением вам придется использовать DLL? Если это одно из приложений Microsoft Office, таких как Word, Outlook и т.

Д., Вы должны иметь возможность использовать VBA и автоматизацию в нем для передачи информации в Excel. Существует бесплатный пакет Visual C: http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-cpp-express, но я не использовал его и не знаю, поддерживает создание файлов DLL или нет. Но это может быть недорогой инструмент обучения! Спасибо JLL. Это хороший старт. Приложение, которое будет использовать DLL, — это Multicharts, с помощью EasyLanguage, у меня есть друг, который, как сделал некоторую кодировку на C, буду искать совет Мартина 🙂

Удачи с проектом. Вот начальная страница со ссылками на другие, включая форумы, где вы можете получить дополнительную помощь по мере ее продвижения. http://msdn.microsoft.com/en-us/vstudio/hh388567.aspx

Источник: https://dlldownloadfree.com/computer-problems/201810/4/51c5159f-7ca5-4c5f-af0a-67578b023ce0.html

Доступ к Dll с помощью excel от c ++-кода

Я пытаюсь создать DLL из кода C ++ с помощью visual studio 2015.

У меня есть файл DLL_Tutorial.h:

#ifndef _DLL_TUTORIAL_H_ #define _DLL_TUTORIAL_H_ #include extern «C» { DECLDIR int Add( int a, int b ); } #endif \

Затем я создал DLL_Tutorial.cpp

#include #include «DLL_Tutorial.h» #define DLL_EXPORT extern «C» { __declspec(dllexport) int Add(int a, int b) { return(a + b); } }

Я получил файл Dll

Я хотел бы назвать свою функцию в VBA и применить ее к листу excel

поэтому в VBA я сделал:

Public Declare Function Add _ Lib «C:UsershasnaDesktopProjet VBA-C++projet5Debugprojet5.dll» (byval a As integer,byval b As integer) As integer

  • Затем в листе excel я ввожу 2 значения (например, 6 и 4), я вызываю функцию добавления, но это дало мне: #VALEUR!
  • В чем проблема ? Не могли бы вы помочь мне решить, что
  • благодаря

В вашем файле заголовка DLL не отображается, что вы префикс экспортированного API с помощью __declspec (dllexport).

Обычно это определяется так, что API может использовать __declspec (dllexport) при построении DLL и __declspec (dllimport), когда заголовок используется во внешнем проекте.

Лучше всего было бы просто создать DLL, используя шаблон проекта VS 2015, он включает правильные заголовки и определения экспорта для вас, поэтому вам просто нужно сосредоточиться на написании API. Вот рабочий пример проекта VS 2015:

Пример * .h:

#pragma once // The following ifdef block is the standard way of creating macros which make exporting // from a DLL simpler. All files within this DLL are compiled with the DLLAPI_EXPORTS // symbol defined on the command line. This symbol should not be defined on any project // that uses this DLL. This way any other project whose source files include this file see // DLLAPI_API functions as being imported from a DLL, whereas this DLL sees symbols // defined with this macro as being exported. #ifdef DLLAPI_EXPORTS #define DLLAPI_API __declspec(dllexport) #else #define DLLAPI_API __declspec(dllimport) #endif // This is an example of an exported function. DLLAPI_API int fnDLLAPI(void);

Пример * .cpp:

// DLLAPI.cpp : Defines the exported functions for the DLL application. // #include «DLLAPI.h» // This is an example of an exported function. DLLAPI_API int fnDLLAPI(void) { return 42; }

Книга Windows Via C / C ++ также является очень хорошим ресурсом для написания DLL. Теперь, касаясь импорта VB, я не уверен, поскольку я не знаком с импортом API через VB.

Источник: https://excel.bilee.com/dll-excel-c.html

Автоматизация документов WORD

Клименко Константиндата публикации 18-11-2002 11:50

Версия для печати В настоящий момент везде, или почти везде, для работы с текстовыми документами используется Word от Microsoft.

Причем, когда читаешь в объявлениях о приеме на работу программиста в фирму не занимающуюся разработкой ПО, то с уверенностью можно сказать, что необходим человек, умеющий работать с офисным пакетом (Word, Excel, Access) от вышеупомянутой фирмы.

Поэтому данным материалом хотелось бы показать, как можно в некоторых случаях упростить работу с текстовым редактором Word.

Для этого не обязательны знания Delphi на профессиональном уровне, достаточно уметь создавать динамически подключаемые библиотеки (DLL) и знать основы VBA для Word. К тому же макроязыки используются не только в пакете от Microsoft, слышал, что аналог VBA есть и в StarOffice.

2. Как подключить DLL в VBA

Любая программа может вызвать функцию из DLL, которая написана на Delphi, независимо от того, написана она на Си, Visual Basic или VBA. Первый вопрос, который может волновать — как это сделать в VBA для Word? Для вызова DLL в VBA для Word существует специальная функция: [Public | Private] Declare Function name Lib «libname» [Alias «aliasname»] [([arglist])] [As type]

Описание функции: Public и Private — разрешение на использование вызываемой функции в других процедурах и модулях и использование только в данном модуле.

  • name — имя вызываемой функции.
  • libname — имя библиотеки.

Alias псевдоним, необходим, когда используются недопустимые символы или существует переменная, название которой совпадает с названием функции

  • arglist — список передаваемых в функцию переменных

As typeтип функции Если необходимо вызвать процедуру, то вместо Function указывается Sub, и соответственно опускается As type.

Например:

Declare Function MyTest Lib «PrjWTest» (ByVal Ns As Byte) As String

Sub WordTest()
Dim S1, S2 As String
S1 = MyTest(1)
End Sub Вызываем функцию MyTest из библиотеки PrjWTest.dll. Функции предаем значение переменной NS, имеющей тип Byte. Функция возвращает строку. Желательно в VBA создать функцию для вызова DLL. В нашем примере это функция WordTest , которая вызывается MACROBUTTON-ом ({ MACROBUTTON WordTest Кликни здесь }(Вставка => Поле => Автоматизация документа)).

3. Как в Delphi создать DLL

Ответ на этот вопрос можно найти во многих справочниках и учебниках по Delphi. Я лишь приведу исходный текст библиотеки. На форме находятся следующие компоненты: Edit1 и Button1, причем Button1.ModalResult = mrOk. Листинг библиотеки (PrjWTest.dpr): Library PrjWTest; uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, UnitWTest in 'UnitWTest.pas' {FormWTest}; var //Это наша форма MyForm : TFormWTest; {*********************Test************************************} Function Test : PChar; Export; stdcall; var TmpStr : String; begin TmpStr := ''; //Вызываем форму if MyForm.ShowModal = mrOk then begin //Считываем текст с Edit TmpStr := MyForm.Edit1.Text; end; //Желательно указать конец строки TmpStr := TmpStr + #0; //Возвращаем текст Test := PChar(TmpStr); end; {*********************MyTest************************************ Данную функцию вызываем из Word} Function MyTest(N : Byte) : PChar; Export; stdcall; begin //Посылаем в Edit число, полученное из Word MyForm.Edit1.Text := IntToStr(N); //Вызываем вспомогательную функцию MyTest := Test; end; {*********************MyTest************************************ Создаем форму} Procedure CreateForm; Export; stdcall; begin MyForm := TFormWTest.Create(Application); end; {*********************MyTest************************************ Освобождаем форму} Procedure FreeForm; Export; stdcall; begin MyForm.Free; end; Exports CreateForm Index 1, MyTest Index 2, FreeForm Index 3; //{$R *.RES} begin { Application.Initialize; Application.CreateForm(TFormGsk, FormGsk); Application.CreateForm(TDataModule2, DataModule2); Application.CreateForm(TFormListBoxs, FormListBoxs); Application.CreateForm(TFormCreateSk, FormCreateSk); Application.CreateForm(TFormAddKontr, FormAddKontr); Application.Run;}
end.
При вызове функции MyTest вызывается наша форма, в Edit помещается переданное число, функция возвращает текст из Edit. Полученную DLL желательно поместить в папку Windows.

4. Проблемы, возникающие при передаче данных.

В данной части хотелось бы обратить внимание на некоторые особенности передачи данных из Delphi в VBA. Во-первых, если передаете текст, то тип передаваемой функции должен быть Pchar, т.к. VBA не понимает типа String.

Во-вторых, VBA все равно при выводе текста в документ выдаст ерунду. Поэтому ниже привожу листинг функции, преобразующей полученный текст в «нормальный».

'Приводим полученный текст в «нормальный» текстовый вид Function StrToStr(St As String) As String Dim EndStr As Long 'Определяем количество символов до конца строки EndStr = InStr(1, St, Chr$(0)) If EndStr 0 Then 'Вырезаем и возвращаем нужную информацию StrToStr = Left(St, EndStr — 1) Else StrToStr = «»
End If
End Function
В-третьих, лучше создавать и освобождать формы отдельными функциями, особенно это видно при работе с базами. 'Подключаемые функции в DLL Declare Sub CreateForm Lib «PrjWTest» () Declare Function MyTest Lib «PrjWTest» (ByVal Ns As Byte) As String Declare Sub FreeForm Lib «PrjWTest» ()

Читайте также:  Как сделать таблицу горизонтально в word?
5. Как вставлять текст в Word.

Это тоже можно найти в справочниках и учебниках по VBA. Но все же приведу несколько советов по этому вопросу. Если строку необходимо вставить в определенное место в тексте, то делаем закладку: Вставка=>Закладка в меню Word. Но лучше использовать две закладки: начало текста и конец. Это может понадобиться в случае замены старого текста на новый (обновление данных). Далее листинг этих функций: 'Переходим к метке Label Sub GotoBookMark(Label As String) Selection.GoTo What:=wdGoToBookmark, Name:=Label With ActiveDocument.Bookmarks .DefaultSorting = wdSortByName .ShowHidden = False End With End Sub 'Вставляет текст NK между закладками BeginBookM и EndBookM Sub NewTxt(BeginBookM As String, EndBookM As String, NK As String) 'Переходим к первой закладке GotoBookMark (BeginBookM) 'Выделяем старый текст между закладками Selection.Extend 'Переходим к второй закладке GotoBookMark (EndBookM) 'Отступаем чтобы не захватить закладку Selection.MoveLeft Unit:=wdCharacter, Count:=1 'Заменяем старый текст на новый
Selection.TypeText Text:=NK
End Sub
И напоследок, листинг основной функции VBA — WordTest, которая вызывает DLL и вставляет текст между закладками: Sub WordTest() Dim S1, S2 As String 'Загружаем DLL и форму CreateForm 'Считываем данные с Edit S1 = MyTest(1) S2 = S1 'Преобразуем в нормальный текст S2 = StrToStr(S2) 'Вставляем текст между закладками NewTxt «BeginTest», «EndTest», S2 'Удаляем формы и выгружаем DLL
FreeForm

Exit Sub
End Sub
Исходники программы и документа прилагаются — AutoWrd.zip (127 K).

Клименко Константин Специально для Королевства Delphi

[Работа с MS Word] [Использование и создание DLL]

 Обсуждение материала [ 09-06-2005 08:53 ] 5 сообщений

Источник: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=715&mode=print

VBA и DLL на D

Для правильной работы проверьте путь до M2DLL.DLL в Declare VBA Excel!

Так получилось, что пришлось мне срочно заняться одной задачей на Excel. Проблема была в том, что нужно было выбирать информацию из большого текстового файла по определенным критериям и вставлять её в Excel. Сразу пришла мысль использовать VBA и при помощи него написать функцию, которая будет выдавать мне строку с информацией.

А почему бы не написать DLL, подумал я, ведь раньше я уже пытался писать DLL для VBA на C++. DLL это быстро, это интересно и позволяет отвлечься от каждодневной рутины.

Но, так как я давно уже всё делаю на D, то и DLL решил писать на D. В качестве путеводителя по дебрям VBA я использовал замечательную книгу Брюса Мак-Кинни «Крепкий орешек 4 visual basic» 1996 года выпуска.

Книга исключительно интересная и занимательная и ни сколько не потеряла своей актуальности.

Однако вернемся в D. Обращаю внимание, что все все примеры, которые представлены ниже, проверены только на Windows 32, Excel 2003 и dmd для Windows. Первым делом пишу строку сборки DLL, где исходный файл m2dll.d, а сама DLL будет называться m2dll.dll. Так же в сборке участвует файл dll.d входящий в поставку dmd и asc1251.d из QtE5.

dmd –ofm2dll.dll m2dll dll asc1251 -L/IMPLIB -release -shared

Небольшое введение. Существует несколько типов вызовов функций отличаются тем как передаются параметры их порядок в стеке и типами возвращаемых значений. Они все стандартизированы и в компиляторах имеются специальные дериктивы указывающие, как должен компилятор оформить функцию. Это следующие типы: pascal, stdcall, winapi и т.д. Более подробно читайте в интернете.
Итак, что у нас.

У нас есть D у которого упращенно тип вызова «extern (D)». Есть Excel VBA в котором упрощенно тип вызова «extern (Windows)». DLL – это набор функций (в терминах C и C++) которые могут быть загружены во время работы приложения. Таким образом, у нас фактически будет набор функций, который мы будем вызывать из VBA. В самом VBA надо описать имя и параметры для вызываемой внешней функции.

Declare Function getAdrStringVBA Lib «r:m2dll.dll» Alias «_getAdr@4» (ByVal buf As String) As Long

Что здесь основное. Это Lib “r:m2dll.dll” – имя DLL и где она расположена, Function getAdrStringVBA – это как данная функция будет называться в VBA, Alias “_getAdr@4” – это как эта функция называется в DLL ну и напоследок список параметров и возвращаемых значений. Для D эта же функция будет выглядеть так:

export extern (Windows) int getAdr(char* buffer) { … }

Компилятору сказано «export» — быдет видна в DLL «extern (Windows)» это тип вызова, winApi и дальше параметры. Все понятно, кроме имени внутри DLL “_getAdr@4”. Это имя экспортированной функции.

Есть много литературы описывающей как задавать эти имена (например в файле DEF и т.д.

) но мне лень это все описывать и намного проще в TotalCommander посмотреть список экспортированных функций по кнопке F3 на полученной DLL.

Теперь о параметрах. Дело в том, что типы параметров в VBA и D (32 разр) совпадают лишь частично!

Int D == Long VBA
Long D == нет соответствия в 32 разр VBA

Таким образом, где нам нужно в D иметь int – значит в VBA это будет long. Когда VBA в функции имеет описание о передачи строки, значит передается адрес этой строки, вернее структуры содержащей в том числе и строку.

Мне было интересно проверить расположение данных в структурах VBA, типа как их обрабатывать в D. Для этого я пользовался интерпретатором VBA (окно Immediate в VBA Excel).
Первая задача – это научится смотреть дамп памяти структуры из VBA например строки.

Как получить адрес строки в VBA, если самом VBA нет понятия указатель, вернее оно присутствует неявно. Первая наша функция в DLL будет возвращать адрес строки VBA. Их описание приведено выше. В VBA возвращается число (long) которое и есть адрес.

Вторая наша функция dumpForVBA(), получая long из VBA, формирует строку С формата и записывает её в буфер, который сформирован VBA внутри функции dumpPointer():

Dim buf As String
buf = String(1000, 0)

Для испытаний, на уровне модуля VBA я определил две переменных:

Public str As String
Public adrStr As Long

Кстати, обращаю внимание, что все переменные в VBA должны быть объявлены явно, если этого не делать, то по умолчанию переменные получают тип Variant с которым D не умеет работать. Я опускаю передачу целых чисел в DLL и их возврат. Тут все просто, все передается и возвращается по значению.

Это и понятно, работаем через аппаратный стек. Намного интереснее строки. Для исследования, я использую процедуру t1() в которой записан код VBA. Просмотр результата в окне Immediate. Если поставить текстовый курсор внутри процедуры t1() на любом операторе и нажать F5 – то будет выполнена эта процедура.

Это избавляет от лишней писанины.

Sub t1()
'1 — исследуем строку VBA
str = «ABC»
adrStr = getAdrStringVBA(str) 'Взяли адрес
'Распечатали содержимое по адресу
Debug.Print adrStr, » —> » & dumpPointer(adrStr, 0)
End Sub

Результат выполнения:
82468836      —> 65 — 66 — 67 — 0 — 0 — 0 — 0 — 0 — 108 — 0 — 0 — 0 –
Действительно видна наша строка.  Если верить «Крепкому орешку», то длина строки расположена в 32 разрядном слове левее нашей строки. Проверим. Для этого вычтем 4 (сместимся на 4 ячейки) и посмотрим дамп.

82468832      —> 3 — 0 — 0 — 0 — 65 — 66 — 67 — 0 — 0 — 0 — 0 — 0 –

Отлично видно, что длина строки равна 3.

После нескольких попыток, выяснилось, что даже в рамках одной процедуры VBA перемещает строки. Вроде по этому адресу должна быть строка, а там её уже нет! Чудеса. Для избавления от этого эффекта пришлось изменить процедуры вызова.

Sub t1()
Dim s1 As String, s2 As String
str = «ABCD»
adrStr = getAdrStringVBA(str)
s1 = dumpPointer(adrStr, 0)
s2 = dumpPointer(adrStr — 4, 0)
Debug.Print adrStr, » —> » & s1
Debug.Print adrStr — 4, » —> » & s2
End Sub

Пришлось ввести две лишних переменных, чтобы предотвратить выделение памяти, которое приводит к перемещению строки в памяти VBA. Теперь результат стабильный.

82338988      —> 65 — 66 — 67 — 68 — 0 — 0 — 0 — 0 — 108 — 0 — 0 — 0 —
82338984      —> 4 — 0 — 0 — 0 — 65 — 66 — 67 — 68 — 0 — 0 — 0 — 0 —

Хорошо. Но надо проверить факт, как это утверждается в документации, того, что VBA всегда ставит 0 (ноль) в конце строки. Как бы это проверить…

Интересная вскрылась ситуация. Оказывается VBA все время меняет расположение строк в памяти. Фактически каждое новое присваивание чего-то строке меняет её адрес в памяти. Причем, старая строка просто занимается новым содержимым, при том уже в формате Unicode.

Dim ms1 As String
ms1 = String(4, 65)
adrStr = getAdrStringVBA(ms1) 'Взяли адрес
s1 = dumpPointer(adrStr, 0)
s2 = dumpPointer(adrStr — 4, 0)
Debug.Print adrStr, » —> » & s1
Debug.Print adrStr — 4, » —> » & s2
ms1 = «BB»
Dim adrStr2 As Long
adrStr2 = getAdrStringVBA(ms1) 'Взяли адрес
Debug.Print adrStr2
s1 = dumpPointer(adrStr, 0)
s2 = dumpPointer(adrStr — 4, 0)
Debug.Print adrStr, » —> » & s1
Debug.Print adrStr — 4, » —> » & s2
EndSub

Вывод:
72519660      —> 65 — 65 — 65 — 65 — 0 — 0 — 53 — 0 — 49 — 0 — 57 — 0 —
72519656      —> 4 — 0 — 0 — 0 — 65 — 65 — 65 — 65 — 0 — 0 — 53 — 0 —
72519860
72519660      —> 66 — 0 — 66 — 0 — 0 — 0 — 32 — 0 — 0 — 0 — 57 — 0 —
72519656      —> 4 — 0 — 0 — 0 — 66 — 0 — 66 — 0 — 0 — 0 — 32 — 0 —

Читайте также:  Как сделать электронную книгу из word?

Вначале создаётся строка из 4 букв A и это видно по адресу 72519660, потом я пытаюсь присвоить более короткую строку в надежде, что VBA экономя обращения к памяти, запишет её в тот же адрес. Однако ничего подобного не происходит. Создается совершенно новая переменная (её адрес 72519860), а в старый адрес записывается новая строка в формате Unicode.

Почитав документацию вижу следующую фразу: «VBA при обращении к внешним функциям DLL создаёт полную копию исходной строки, при этом конвертируя её из исходного формата Unicode в ASCII представление с конечным нулем для обработки функциями WinApi».

Вот оно оказывается как. Теперь понятно почему оператор ms1 = «BB» вызвал создание новой копии. Это была подготовка к вызову внешней функции. Провожу ещё один эксперимент, пытаюсь понять, неужели VBA на каждое присваивание заново делает выделение памяти.

Ниже кусочек кода:

ms1 = String(10, 65)
ms1 = «BB»
adrStr = getAdrStringVBA(ms1)
s1 = dumpPointer(adrStr, 0)
s2 = dumpPointer(adrStr — 4, 0)
Debug.Print adrStr, » —> » & s1
Debug.Print adrStr — 4, » —> » & s2

Вывод:
72520940      —> 66 — 66 — 0 — 0 — 65 — 0 — 65 — 0 — 65 — 0 — 65 — 0 —
72520936      —> 2 — 0 — 0 — 0 — 66 — 66 — 0 — 0 — 65 — 0 — 65 — 0 —

Вот и ответ. Забиваем строку 10 буквами A (код 65) и тут же присваиваем новое значение “BB” – которое явно короче и может использовать старый буфер. И точно – в ответе видно, что был использован предыдущий буфер, который был забит 10 буквами A в Unicod (65;0), но в него положили уже сконвертированное значение, подготовленное для передачи во внешнюю функцию.

Со строками разобрались. Вывод для работы со строками в DLL: обязательно нужна промежуточная функция на VBA, которая создаст локальный буфер большого размера, в который мы из DLL и будем записывать результирующие строки для возврата в VBA.

Далее нужно извлечь из этого буфера нужное количество символов, которое мы вернем как возвращаемое значение. Пример такого подхода Public Function dumpPointer(pointer As Long, sw As Long) As String. Хорошо, а как быть со строками которые нужно отдать в DLL.

А тут все просто, VBA сам выделяет буфер и ещё конвертирует из Unicode, да ещё и количество записывает, что для нас очень кстати, так как позволяет передавать и 0 в строке (фактически двоичные данные). Таким образом можно и передать и вернуть двоичные данные.

Добраться до внутреннего представления строк VBA в Unicode возможно, но есть ли в этом надобность.

Рассмотрим массивы и их передачу в DLL. Начнем с массива целых чисел. Что бы получить адрес массива, мы воспользуемся той же функцией в DLL, что и для получения адреса строк. Единственно, что немного обманем VBA, написав новую декларацию.

Declare Function getAdrArrayVBA Lib «r:m2dll.dll» Alias «_getAdr@4» (ByRef buf As Long) As Long

В чем тут хитрость? В том, что мы фактически передаём ссылку на элемент массива. А как указать на весь массив, а просто передать ссылку на его первый элемент и количество таких элементов. Количество передать легко, а вот проверить возможность передачи адреса первого элемента надо.

Dim m(2) As Long
m(0) = 1: m(1) = 3
adrStr = getAdrArrayVBA(m(0))
s1 = dumpPointer(adrStr, 0)
s2 = dumpPointer(adrStr — 4, 0)
Debug.Print adrStr, » —> » & s1
Debug.Print adrStr — 4, » —> » & s2

Вывод:
72514896      —> 1 — 0 — 0 — 0 — 3 — 0 — 0 — 0 — 0 — 0 — 0 — 0 —

72514892      —> 0 — 0 — 0 — 140 — 1 — 0 — 0 — 0 — 3 — 0 — 0 — 0 —

Мы забираем адрес первого элемента массива и в дампе фактически видим сам массив в разрезе четырех байт. Отсюда вывод о том, как работать с массивами. Создаём массив большого размера, в DLL его модифицируем, передавая новую длину, и уже в VBA копируем значимую часть для сохранения результата. Аналогичный должно быть и со структурами, но проверять мне было лень…

Теперь, когда более менее ясно как обмениваться данными из VBA в DLL, вернемся непосредственно в D. Фактически разработчики уже все за нас предусмотрели написав нам dll.d!

В ней описываются точки входа и инициализация GC и Phobos. Таким образом, делать практически ничего не нужно. НО! Есть маленькое но.

Так как у нас функции extern (Windows) нам не позволено пользоваться в таких процедурах всеми возможностями динамического распределения памяти. Я не могу дать четкого ответа, чем можно пользоваться а чем нет, но есть выход.

Определяем обычные функции (по умолчанию они будут вызова D) и спокойно в них делаем работу, а функции extern (Windows) используем только для обмена параметрами с VBA.

Исходный код m2dll.d с ми, а также все необходимые файлы прикреплены ниже. А вот базу с данными, которые передавались в Excel, к сожалению, предоставить не могу, ибо в ней конфиденциальная информация.

Файлы: vba_and_d.zip

Источник: https://lhs-blog.info/programming/dlang/vba-i-dll-na-d/

Создание C ++ .dll для использования Excel & amp; C # (32/64-битное окно)

Недавно я хотел бы начать сборку математической библиотеки .dll с помощью Visual C ++ Express 2010.

Я хотел бы использовать .dll в качестве справочной библиотеки для ОБА Excel VBA & C# Приложения. Я ожидаю, что это будет работать в обоих 32bit/64bit Окно. .Dll также может быть использован другим компьютером после сборки.

  1. Правильно ли начать с помощью Win32 Project? (кажется, я не могу использовать ATL / MFC в экспресс версии)

  2. Нужно ли указывать в .dll 2 разных набора интерфейсов для VBA & C # для загрузки функций? (VBA требует использования __stdcall)

  3. Какие-либо настройки развертывания для использования .dll на другом ПК? (нужен какой-нибудь процесс regsvr32 cmd?)

  4. Любой пример для начинающих сделать C ++ DLL для экспорта класса? (например, VBA / C # может создать новый класс из этой библиотеки DLL) …

Потому что я не уверен, смогу ли я создать экземпляр ClassA & ClassB в VBA / C # с приведенным ниже .header файлом в c ++ .dll:

#pragma once

#ifdef DLLDIR_EX
#define DLLDIR __declspec(dllexport) // export DLL information
#else
#define DLLDIR __declspec(dllimport) // import DLL information
#endif

class DLLDIR ClassA
{
public:
void AMethod1();
void AMethod2();
};

class DLLDIR ClassB
{
public:
void BMethodi();
void BMethodii();
};

1

Вы не можете использовать C ++ для создания DLL-файла, который экспортирует типы COM или функции в стиле C и позволяет ему работать как в 32-битной, так и в 64-битной среде.

Файлы DLL являются своего рода образом PE / COFF, и PE поддерживает только один ISA на файл (сравните с исполняемым форматом Macintosh, который позволяет использовать несколько ISA в одном файле образа). Вы должны перекомпилировать дважды, один для x86, другой для x64.

Единственным исключением из этого правила являются .NET-библиотеки «AnyCPU», но это уже другая история.

Согласно этой сравнительной таблице, C ++ Express 2010 не включает компилятор x64 и библиотеки MFC и ATL, хотя вы можете загрузить их как часть Windows SDK отдельно.

В ответ на ваши вопросы:

  1. Лично я бы начал с шаблона «Пустой проект» — мне не нравятся все ненужные заголовки и (казалось бы) сложные начальные настройки проекта, которые предоставляет шаблон Win32. Затем я бы вручную добавил свои собственные файлы .c / .h / .cpp и удалил код.
  2. Если вы просто экспортируете функции, а не типы COM, вам не нужно беспокоиться об интерфейсах. Пока ваши функции экспортируются правильно (см. Здесь: http://msdn.microsoft.com/en-us/library/ys435b3s%28v=vs.80%29.aspx ) затем они могут быть вызваны из .NET (включая C # и VB.NET), VB6 / VBA и C / C ++.
  3. «другой ПК»?

1

Что касается # 2, вам не нужны два набора интерфейсов, потому что C # также может использовать соглашение о вызовах __stdcall.

Источник: https://web-answers.ru/c/sozdanie-c-dll-dlja-ispolzovanija-excel-amp-c-32.html

Надстройки Excel

Подробности Создано 27 Март 2011

Те, кто программирует на VBA для Excel, в определенный момент задумываются над распространением своих приложений в качестве независимых файлов. Лучшая возможность для организации распространяемых файлов – это создание специальных дополнений или надстроек Excel. За время развития программы появилось несколько типов надстроек. Мы попытались собрать и систематизировать информацию для разработчиков обо всех видах, назначениях, достоинствах и недостатках надстроек Excel.

Персональная книга макросов

Описание: хранение общих функций и процедур для персонального использования
Требования: нет
Достоинства: возможность хранения пользовательских функций для работы с данными (UDF)
Недостатки: сложности с тиражированием

Для общих программ и макросов можно использовать, так называемую, личную книгу макросов – по умолчанию это файл PERSONAL.XLS (в Excel 2007-2010 PERSONAL.XLSB). Файл с данным именем создается с при записи макроса средствами Excel. Этот файл будет автоматически загружаться каждый раз при запуске Excel. Местонахождение данного файла в каталоге Windows: ПОЛЬЗОВАТЕЛЬApplicationDataMicrosoftExcelXLSTART. На самом деле Excel будет запускать автоматически все файлы из данного каталога, независимо от имен файлов.

В принципе, личные книги макросов можно считать надстройками Excel. В файле PERSONAL.XLS (или любом другом из стартового каталога) можно хранить общие функции и макросы, автоматизирующие часто повторяемые операции. Для выполнения каких-либо операций при старте Excel можно использовать событие Worbook_Open этого файла, либо процедуру Auto_Open в модуле кода.

Как вносить исправления в PERSONAL.XLSB

XLA/XLAM

Описание: стандартная надстройка
Требования: нет
Достоинства: возможность создания тиражируемых продуктов
Недостатки: слабая защита исходного кода программ.
Читайте также:  Как сделать раскрывающееся меню в Excel?

Надстройки с расширением xla (в версии 2007-2010 xlam) представляют собой стандартный xls-файл, который может быть открыт как невидимая в списке открытых файлов рабочая книга.

Файл надстройки обычно содержит программный код, который управляет какими-либо оперциями активной рабочей книги Excel.

Теоретически, кроме модулей кода, в состав xla-файла могут быть таблицы и даже листы диаграмм, но надо понимать, что особого смысла в этих данных нет, так как нет возможности отобразить эти данные на экране стандартными средствами.

На рабочих листах надстройки можно хранить, например, константы для работы кода, если по каким-либо соображениям не хочется использовать константы VBA. Данные в ячейках файла надстройки можно даже изменять во время работы, но сохранять открытый и исполняемый в данный момент файл xla в общем случае недопустимо.

Для доступа к данным рабочей книги надстройки используется объект ThisWorkbook, а для работы с активной рабочей книгой – объект ActiveWorkbook.

В надстройках имеется возможность хранить пользовательские функции для работы с данными рабочих листов (user defined function — UDF). Только надо учитывать, что в этом случае рабочий файл сохраняет ссылку (связь) на файл надстройки по абсолютному пути. Эта особенность может затруднить распространение программных продуктов.

Отладку надстроек лучше производить через xls-файл (не забывая различия между ThisWorkbook и ActiveWorkbook), а впоследствии сохранять этот файл как xla.

Нектороые сложности могут в этом случае возникнуть при использовании событий Workbook_AddinInstall и Workbook_AddinUninstall, так как их невозможно эмулировать в простом файле рабочей книги.

К счастью, эти события требуются крайне редко; честно говоря, мы не знаем ни одного примера их полезного использования на практике.

Подключать готовую XLA-надстройку можно через соответствующий диалог (Excel 2000-2003 Сервис Надстройки, Excel 2007 Кнопка Office Параметры Excel Надстройки Перейти).

Подключаемые надстройки прописываются в реестре Windows по адресу HKEY_CURRENT_USERSoftwareMicrosoftOffice НОМЕР_ВЕРСИИ.

0 ExcelOptions в строковых параметрах с префиксом OPEN и порядковым номером надстройки (причем первая по порядку надстройка номера не имеет). Управляя этим ключом реестра, можно подключить / отключить надстройку через инсталляционные программы.

Это, кстати, еще одна причина никогда не использовать событие Workbook_AddinInstall – очевидно, что оно не будет вызвано при изменении ключей реестра внешними программами.

Имя и описание надстройки можно задать в свойствах файла перед его сохранением в форматие xla/xlam (Excel 2000-2003 Файл Свойства, Excel 2007 Кнопка Office Подготовить Свойства).

Важным преимуществом надстройки XLA/XLAM вместо использования кода внутри рабочих файлов является возможность повторного использования кода VBA. Кроме того, установленные надстройки не спрашивают о наличии макросов при запуске Excel на любом уровне безопасности.

Интересная, но скорее всего бесполезная в работе информация. Надстройки XLA в Excel версии 5.0-8.0 (95-97) хранятся в скомпилированном виде. В связи с этим, там просто нет исходного текста программ в открытом или зашифрованном виде.

Эта особенность приводит к невозможности декомпиляции или вскрытию кода специальными средствами. К сожалению, в последующих версиях Excel надстройки хранятся в нескомпилированном виде и легко преобразуются в доступный для изменения файл, даже будучи защищенными паролями.

Microsoft рекомендует использовать для разработчиков возможности COM-DLL и средства VSTO (см. далее).

В качестве примера XLA-надстройки, можно ознакомиться с исходным кодом надстройки ExcelFin в разделе Программы.

XLS/XLA как ссылка

Описание: библиотека кода VBA
Требования: нет
Достоинства: не требует компиляции во внешних программных продуктах
Недостатки: сложность распространения из-за абсолютных ссылок на файлы

Если вы создали набор общеупотребительных функций, но не имеете возможность скомпилировать библиотеку в виде XLL или DLL-файла (см.ниже), то можно подключить любой VBA-код XLS-файла в качестве ссылки в проекте. Делается это в окне редактора кода через меню ToolsReferences.

В этом случае вы также можете избавиться от повторного использования кода, но такой вариант вызывает дополнительные сложности при распространении рабочего файла, так как в проекте сохраняются абсолютные пути к ссылкам.

При использовании общего кода XLA-надстроек и ссылок к XLS-файлам важную роль играет определение методов и свойств класса Friend. Эти методы и свойства видны внутри проекта, но не во внешнем файле, использующем ссылку. Внутри одного файла определение Friend соответствует Public.

XLL

Описание: библиотека функций рабочего листа
Требования: компилятор C/C++ и API-библиотека
Достоинства: создание наиболее производительных функций с полным встраиванием в интерфейс Excel
Недостатки: нет

Наиболее производительные пользовательские функций для работы с таблицами реализуются при помощи XLL-надстроек.

XLL-надстройка представляет собой скомпилированный на C/C++ файл динамической библиотеки Windows, специально предназначенной для использования в Excel.

Разработчикам предоставляется специальная библиотека C API (Excel XLL SDK). Использование языка C с возможностью управления памятью позволяют разработать самые мощные и производительные функции для работы с данными Excel.

Сравните производительность встроенных функций и UDF, разработанных на VBA.

Мы не имеем практического опыта разработки XLL-надстроек, поэтому желающих разрабатывать библиотеки такого типа отсылаем к MSDN.

Microsoft Excel 2010 XLL Software Development Kit

Имеется не очень стандартный способ регистрации UDF-функций для вывода пользовательской функции на VBA в интерфейсе Excel через Application.ExecuteExcel4Macro(“REGISTER(…)”) . Метод проверен и работает. Но не дает никаких преимуществ в производительности функций, поэтому в практической работе его ценность сомнительна. Подробнее читайте:

Регистрация UDF

Описание: полнофункциональная надстройка Excel
Требования: ODE 97 или ODT XP
Достоинства: возможность создания интерфейса любой сложности; полностью закрытый исходный код.
Недостатки: невозможно создание пользовательских функций для работы с данными (UDF)

Версии Excel 97 (8.0), 2000 (9.0) и XP (10.0) имели специальный вариант пакетов для разработчика под названием DeveloperEdition (ODE) или DeveloperTools (ODT). В версиях ODE 9.0 и ODT 10.

0 имелась возможность создавать библиотеки формата ActiveX DLL непосредственно при помощи пакета Office без использования внешних компиляторов.

К сожалению, в последующих версиях Excel эта возможность была удалена, Microsoft отсылает разработчиков к технологии Visual Studio Tools for Office (VSTO) с использованием .NET Framework.

Главной особенность Excel ODT является наличие возможности создания проекта VBA независимого от xls-файла, с возможностью последующей компиляции данного проекта в файл формата DLL (ActiveX DLL).

Исходный VBA-проект содержит специальный дизайнер с методами обработки событий Excel. В проекте, кроме этого, доступны для создания обычные модули кода, классы и формы. Причем формы могут быть открыты немодально.

Надстройки данного типа могут быть подключены к различным версиям Excel одновременно.

Файл DLL, скомпилированный с помощью ODE/ODT не требует никаких дополнительных исполняемых модулей для своей работы, кроме, собственно говоря, Excel.

Здесь важное замечание, что, даже если вас заинтересовали возможности ODE/ODT, вам вряд ли удастся приобрести лицензионные версии этих продуктов – Microsoft с 2003го года прекратил их распространение.

Вообще же вероятно, что в России, официальным способом было приобретено совсем небольшое количество копий пакетов для разработчиков, поэтому искать пиратскую версию этих продуктов тоже особого смысла не имеет.

Microsoft Office 2000 Developer EditionMicrosoft Office XP Developer

В отличие от панелей инструментов, новый пользовательский интерфейс Excel 2007 в виде ленты (ribbons) не имеет встроенных механизмов настройки напрямую через VBA.

Имеется довольно странный механизм настройки ленты через редактирование xml-файла. Формат xlsx представляет из себя zip-архив нескольких файлов и папок, в одном из которых доступна настройка на ленте пользовательских функций. Странно, но разработчики Excel почему-то не предоставили интерфейс для настройки ленты иным способом. Подробнее см. MSDN:

Настройка ленты Office 2007

В тех случаях, когда основной алгоритм закрыт в COM-надстройке, вызов функций и процедур (например, из обработчиков пунктов меню) осуществляется через механизм позднего связывания (Late-bound). Для получения доступа к объекту надстройки используется функция COMAddIns объекта Application с указанием имени COM-надстройки. Например:

Private Function GetAddinObject_() As Object
Dim obj As Object

On Error Resume Next

Set obj = Application.COMAddIns(«имя.надстройки»).Object

Set GetAddinObject_ = obj
End Function

Описание: полнофункциональная надстройка Excel
Требования: Visual Studio .NET различных версий и пакет VSTO
Достоинства: возможность создания интерфейса любой сложности, с использованием специфических возможностей Office 2003-2010: окна, ассистент, лента
Недостатки: требует специальный run-time-пакет (иногда несколько инсталляционных файлов) при распространении.

Этот инструмент, пожалуй, наиболее мощное средство разработки надстроек Excel. Разработчику доступны все средства технологии .NET, в том числе различные языки программирования, элементы управления и прочие ресурсы.

VSTO предоставляет разработчику специальный шаблон проекта .NET. Доступ к объектам Excel осуществляется стандартными средствами языков программирования. В результате компиляции проекта также как в предыдущем примере формируется COM DLL файл.

Здесь главное отличие от DLL, скомпилированных в ODT, это возможность использования любых элементов управления .NET. Однако, в отличие от ODT COM DLL, разработанный с использованием VSTO, требует дополнительных run-time пакетов на компьютере конечного пользователя.

Последнее может существенно затруднить распространение программных продуктов.

Пример функциональноых возможностей настройки с использованием VSTO представлен на сайте в разделе Надстройки. В разделе Загрузки можно скачать архив исходного кода VB.NET этой надстройки.

VSTO Миграция от ODT к VSTO

Типичная проблема при работе с большими или очень большими файлами Excel — это слишком сильное замедление при выполнении любых расчетов….
В статье представлен обзор популярных задач финансового менеджмента, доступных для решения с помощью электронных таблиц. Выводы и…
При построении экономических моделей, обработке больших объемов данных, статистических расчетах и других задачах, решаемых при помощи…
В статье описываются возможности использования буфера обмена Windows и Microsoft Office, а также особенности копирования и вставки данных в Excel….
В данной статье описывается небольшой, но очень удобный класс для сохранения и автоматического восстановления таких параметров…

Источник: https://www.excelfin.ru/index.php/soft/54

Ссылка на основную публикацию
Adblock
detector