在通用Windows应用程序C ++上使用win32 DLL库

时间:2017-08-21 09:18:34

标签: c++ winapi dll windows-10-universal

我能够按照本教程http://tutplusplus.blogspot.com/2011/04/c-tutorial-create-dll-in-vc-20102008.html中指示的说明编译dll库。我编译它并没有问题。我还在一个空的win32控制台应用程序解决方案上测试了我的dll库,并通过添加头文件,源文件和更改链接器设置来编译它。问题是我这次不能在通用Windows应用程序解决方案上使用dll库。我添加了头文件和源文件,并更改了链接器设置。

当我编译项目解决方案时,它要求我将pch.h包含在我的库的源文件中,所以我在顶部添加了行#include "pch.h"

之后,出现了其他编译​​器错误。

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

我相信当前项目解决方案的编译器 再次重新编译所有 而不考虑dll库的编译。如何让项目解决方案只编译自己的源文件和头文件?

Lib Header:

#pragma once
#include <Windows.h>

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

Lib资料来源:

#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;
    }

}

2 个答案:

答案 0 :(得分:3)

您无法使用此DLL,因为它使用的SetCommState功能仅适用于桌面应用程序。您应该在list of desktop APIs available for UWP applications中查找要尝试使用的函数。

对于CreateFile,它不是一个函数,而是根据项目Unicode设置扩展到CreateFileACreateFileW的宏。您应该使用CreateFile2代替桌面和UWP应用程序。

答案 1 :(得分:1)

原因很简单。 WinRT不支持完整的WinApi!您必须使用UWP Namespace

中的WinRT功能

只需阅读CreateFile的文档即可。在您根据要求找到的文件中:

  

支持的最低客户端Windows XP [仅限桌面应用] 最低要求   支持的服务器Windows Server 2003 [仅限桌面应用程序]

这告诉您WinRT中不允许使用CreateFile。

AFAIK无法从WinRT访问串行端口。只是谷歌。这是一个answer来说明这一点。相同here