Здравствуйте, я ищу информацию о том, как и с помощью инструмента witch, создать DLL для работы с системой 64, которая будет использоваться для отправки строки данных в ячейку Excel. Dll для использования во внешнем приложении, которое должно отправлять данные в Excel.
Я много кодировал в VBA, но ни один на C или другом языке.
Dll для получения в качестве ввода — Имя файла Excel — Имя листа Excel — Адрес ячейки — Строковое значение Вопросы: — Какое программное обеспечение / компилятор мне нужно — Где я могу получить библиотеку Office Дополнительный вопрос: Является ли DLL в 64-битной версии, которая сможет разговаривать с My Excel в 32 бит. Excel не является вызывающим, он получит только информацию, которую он отправил ему. Любая помощь приветствовала Мартина 🙂 P.S. Надеюсь, я достаточно ясен в своем не очень хорошем английском и совершенно не знаю о предмете 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 или нет. Но это может быть недорогой инструмент обучения!
Для настоящей 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» ()
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 —
Вначале создаётся строка из 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 также может быть использован другим компьютером после сборки.
-
Правильно ли начать с помощью Win32 Project? (кажется, я не могу использовать ATL / MFC в экспресс версии)
-
Нужно ли указывать в .dll 2 разных набора интерфейсов для VBA & C # для загрузки функций? (VBA требует использования __stdcall)
-
Какие-либо настройки развертывания для использования .dll на другом ПК? (нужен какой-нибудь процесс regsvr32 cmd?)
-
Любой пример для начинающих сделать 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 отдельно.
В ответ на ваши вопросы:
- Лично я бы начал с шаблона «Пустой проект» — мне не нравятся все ненужные заголовки и (казалось бы) сложные начальные настройки проекта, которые предоставляет шаблон Win32. Затем я бы вручную добавил свои собственные файлы .c / .h / .cpp и удалил код.
- Если вы просто экспортируете функции, а не типы COM, вам не нужно беспокоиться об интерфейсах. Пока ваши функции экспортируются правильно (см. Здесь: http://msdn.microsoft.com/en-us/library/ys435b3s%28v=vs.80%29.aspx ) затем они могут быть вызваны из .NET (включая C # и VB.NET), VB6 / VBA и C / C ++.
- «другой ПК»?
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
Описание: | стандартная надстройка |
Требования: | нет |
Достоинства: | возможность создания тиражируемых продуктов |
Недостатки: | слабая защита исходного кода программ. |
Надстройки с расширением 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