В моем проекте необходимо создать библиотеки C ++ DLL, к которым можно получить доступ в Excel VBA, Python, et c. с соответствующей модификацией кода интерфейса для языка интерфейса. Ключевым требованием является возможность доступа к библиотекам, имеющим пространства имен с классами. И классы DLL могут быть созданы в вызывающем коде для доступа к переменным, включая массивы / векторы и методы. Ниже приведен код C ++, просто иллюстрирующий требования. Если язык dll (cdll. cpp, cdll.h) и интерфейс (capp. cpp) оба являются C ++, а DLL неявно экспортируется / импортируется, приведенный ниже код работает как желания. Но я не могу явно экспортировать / импортировать DLL в C ++, как требуется для других языковых интерфейсов.
Я провел обширные поиски в Интернете и нашел много информации, касающейся простого экспорта (только функции и переменные), который я успешно закодированы. Но не достаточная информация для DLL, включая пространства имен / классы, которые могут быть созданы для объектов. Я пропустил MSFT или другие источники информации о выполнении этого? Или кто-то может изменить мои ниже, чтобы проиллюстрировать, как явно экспортировать / импортировать в C ++ (возможно, также с VBA front-end).
Спасибо.
// Using MSCV in VS2019/VS Code
// capp.cpp
// cl /EHsc /LDd cdll.cpp // Compile DLL 1st
// cl /EHsc /Zi capp.cpp cdll.lib // Compile 2nd
#include <iostream>
#include <vector>
#include <array>
#include "cdll.h"
using namespace std;
void main() {
const size_t rows=2; const size_t cols=2;
double a[rows][cols];
nscl::exclass iexc; // instantiate
iexc.d1 = 2.2;
iexc.i1 = 3;
iexc.s1 = "Before";
int r1 = iexc.cha(a[0],rows,cols);
}
// cdll.cpp
// cl /EHsc /LDd /Zi cdll.cpp
#include <string>
#include <iostream>
#include "cdll.h"
nscl::exclass::exclass() : i1{0},d1{0.0},s1{""} {};
int nscl::exclass::cha(double *a,size_t r, size_t c ){
i1 = 44;
d1 = 33.5;
s1 = "After";
for (int i=0;i<r;++i) {
for (int j=0; j<c; ++j) {
//*a[i][j] = += 2.1; // won't compile, array pointer decay, recast???
//*((a +i)+j) += 2.1; // compiles but does not work correctly
//*(a + c*i +j) += 2.1; // compiles & works correctly
a[c*i +j] += 2.1; // compiles & works correctly
}
}
return 0;
}
// cdll.h
#pragma once
#include <string>
namespace nscl {
extern "C" {
class __declspec(dllexport) exclass {
public:
exclass(); //constructor
double __stdcall d1;
int __stdcall i1;
std::string __stdcall s1;
int __stdcall cha(double *a,size_t r, size_t c );
};
}
}