MSCV DLL __declspe c (dllexport / dllimport) проблемы - PullRequest
0 голосов
/ 17 апреля 2020

В моем проекте необходимо создать библиотеки 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 );
        };
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...