2017-08-21 4 views
0

J'ai été capable de compiler une bibliothèque dll en suivant les instructions indiquées dans ce tutoriel http://tutplusplus.blogspot.com/2011/04/c-tutorial-create-dll-in-vc-20102008.html. Je l'ai compilé et il n'y a pas de problèmes. J'ai également testé ma bibliothèque dll sur une solution d'application de console Win32 vide et il compilé correctement en ajoutant l'en-tête, le fichier source et en modifiant les paramètres de l'éditeur de liens. Le problème est que je ne peux pas utiliser la bibliothèque dll cette fois sur une solution Universal Windows App. J'ai ajouté l'en-tête et les fichiers source ainsi que les paramètres de l'éditeur de liens. Lorsque j'ai compilé la solution du projet, il m'a demandé d'inclure pch.h dans le fichier source de ma bibliothèque, donc j'ai ajouté la ligne #include "pch.h".Utilisation d'une bibliothèque DLL win32 sur une application Windows universelle C++

Ensuite, d'autres erreurs de compilation sont apparues.

'CreateFile': identifier not found et 'SetCommState': identifier not found

je crois que le compilateur pour ma solution actuelle de projet de tout recompilé à nouveau sans tenir compte de la compilation de la bibliothèque dll. Comment puis-je faire que la solution de projet compile ses propres fichiers source et en-tête?

Lib tête:

#pragma once 
#include <Windows.h> 

namespace nmspace 
{ 
    class SerialPort 
    { 
    public: 
     static __declspec(dllexport) int connect(); 
    }; 
} 

Lib Source:

#include <iostream> 
using namespace std; 
#include "SimpleH.h" 
#include <Windows.h> 

namespace nmspace 
{ 
    int SerialPort::connect() 
    { 
     int error = 0; 
     DCB dcb; 

     memset(&dcb, 0, sizeof(dcb)); 

     dcb.DCBlength = sizeof(dcb); 

     dcb.BaudRate = 57600; 
     dcb.Parity = NOPARITY; 
     dcb.fParity = 0; 
     dcb.StopBits = ONESTOPBIT; 
     dcb.ByteSize = 8; 

     HANDLE m_serialPortHandle = CreateFile(L"COM7", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, NULL, NULL); 

     if (m_serialPortHandle != INVALID_HANDLE_VALUE) { 
      if (!SetCommState(m_serialPortHandle, &dcb)) 
       error = 2; 
     } 
     else 
      error = 1; 

     return error; 
    } 

} 

Répondre

3

Vous ne pouvez pas utiliser cette DLL, car il utilise la fonction SetCommState qui est disponible uniquement pour les applications de bureau. Vous devriez rechercher les fonctions que vous essayez d'utiliser dans un list of desktop APIs available for UWP applications.

Comme pour CreateFile ce n'est pas une fonction, mais une macro qui s'étend à CreateFileA ou CreateFileW selon les paramètres Unicode du projet. Vous devez utiliser CreateFile2 à la place, disponible pour les applications Desktop et UWP.

+0

merci, que diriez-vous de 'setcommstate' pour les applications upw? désolé je ne veux pas utiliser la bibliothèque 'serialdevice' de uwp et je voulais le créer par moi-même – Gibs

+0

Est-ce que' setcommstate' est quelque chose de différent de 'SetCommState'? – VTT

+0

Ils sont pareils. C'est juste que 'SetCommState' ne fonctionne pas dans UWP. – Gibs

1

La raison est très simple. WinRT ne supporte pas le WinApi complet! Vous devez utiliser la fonction WinRT à partir du UWP Namespace

Lisez simplement les documents à CreateFile. Dans les documentations que vous trouverez sous conditions:

client pris en charge minimale Windows XP [applications de bureau uniquement] minimum serveur Windows Server 2003 [applications de bureau uniquement]

Cela vous dit que CreateFile n'est pas autorisé dans WinRT.

AFAIK l'accès à un port série à partir de WinRT n'est pas possible. Juste google. Voici un answer qui l'indique. Même here