Parte 2.
serial.h
#pragma once
#include <windows.h>
// non sapendo cosa sia SERIALPORT_API
// lo riduco a __stdcall (in merito all'esempio)
#define SERIALPORT_API __stdcall
namespace SerialPort { //MySerial
class MySerial {
private:
HANDLE handler;
bool connected;
COMSTAT status;
DWORD errors;
public:
void SERIALPORT_API open(const char *portName);
bool is_connected() { return connected; }
};
}
serial.cpp
#include "stdafx.h"
#include "serial.h"
#include <iostream>
#include <fstream>
namespace SerialPort {
void MySerial::open(const char *portName)
{
std::ofstream fp("log.txt");
if (fp) {
fp << " Inizializzazione dei parametri di Arduino e della porta seriale ...\n";
fp << " (...Sto connettendo...) \n";
fp << "mode com4: baud=115200 parity=o data=8 stop=1 xon=off" << std::endl; //Stringa per i dettagli di connessione
}
this->connected = true; //prosegue...
}
}
Una volta compilata la DLL (modalità release x64) crea un nuovo progetto di prova, prendi il file .dll e il file .lib e li copi nella cartella.
progetto di prova aggiungi in source files il .lib e nel main scrivi:
#include "stdafx.h"
#include <cstdint>
// prototipi delle funzioni esportate
extern "C" __declspec(dllimport) uintptr_t __stdcall HapticTable_create();
extern "C" __declspec(dllimport) void __stdcall HapticTable_destroy(uintptr_t);
extern "C" __declspec(dllimport) uint8_t __stdcall HapticTable_init(uintptr_t value);
int main() {
uintptr_t obj = HapticTable_create();
uint8_t res = HapticTable_init(obj);
HapticTable_destroy(obj);
return 0;
}
eseguito l'applicativo di prova dovresti trovare un file di nome log.txt nella directory di progetto, segno che tutto è ok.
Come vedi sono due classi in file diversi, all'interno della stessa DLL.
L'unico file critico è dllinterface.cpp dato che è lui a doversi occupare degli aspetti di interfacciamento con ambienti esterni.
A seconda che nella fase di creazione della DLL si scelga di utilizzare la CRT in formato DLL o statica, la DLL creata può essere usata ovunque senza runtime (link con CRT statica), oppure è necessario che nel sistema dove sarà usata la DLL sia presente la stessa CRT usata dal compilatore (link con CRT in formato DLL).
Entrambi gli approcci sono validi ma hanno pro e contro. Valuta quale ti conviene usare.
Ultima cosa.
Matlab usa solo il caricamento dinamico della DLL, quindi il file .lib non gli serve ma può essere necessario per chi usa la tua DLL, nel qual caso devi anche creare un opportuno file header con i prototipi (come le prime righe del progetto di test)
Qui documentazione su Matlab e DLL.
http://matlab.izmiran.ru/help/techdoc/matlab_external/ch2_shar.html