UWP c++ winrt app shows SHGDNF is unidentified in ShObjldl_core.h - desktop-bridge

I'm moving a c# .netcore application to UWP desktop bridge. I'm able to deploy and build the app, but when adding the c++ winrt component I get an error indicating SHGDNF is unidentified in ShObjldl_core.h below is pch.cpp
`#pragma once
#include <stdio.h>
#include <tchar.h>
#include <Unknwn.h>
#include <winrt/base.h>
#include <shlwapi.h>
#include <pathcch.h>
#include <ShlGuid.h>
#include <ShObjIdl_core.h>
#include <ShlObj_core.h>
#include <cfapi.h>
#include <ntstatus.h>
#include <sddl.h>
#include <winrt\windows.storage.provider.h>
#include <winrt\Windows.Security.Cryptography.h>
#include <ppltasks.h>
#include <strsafe.h>`

You could press F12 over ShObjIdl_core.h to view the document, and you will see there is a #if statement #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) which says the header file is usable for Desktop Win32 apps(but not store apps). A C++/Winrt component project is not a Win32 app, therefore, ShObjIdl_core.h header could not be used in the project.

Related

moc failing with 'Undefined interface' with Qt 5.10 in a Docker container

A very simple Qt project fails to build for me with Qt 5.10 in a Docker container (with an image derived from opensuse:tumbleweed). The project is as follows:
sh-4.4# cat test.pro
TEMPLATE = app
TARGET = test
INCLUDEPATH += .
INCLUDEPATH += sub
HEADERS = obj.h sub/iface.h
SOURCES = obj.cpp main.cpp
sh-4.4# cat sub/iface.h
#pragma once
#include <QtPlugin>
class Interface
{
public:
virtual ~Interface () {}
};
Q_DECLARE_INTERFACE (Interface, "org.meh.interface/1.0")
sh-4.4# cat obj.h
#pragma once
#include <QObject>
#include <sub/iface.h>
class Obj : public QObject
{
Q_OBJECT
Q_INTERFACES (Interface)
};
sh-4.4# cat obj.cpp
#include "obj.h"
sh-4.4# cat main.cpp
int main() {}
In this case moc complains as follows:
obj.h:9: Error: Undefined interface
Everything is fine in another container with Qt 5.9, and everything is also fine with Qt 5.10 when the project is built in openSUSE Build Service (which uses something else instead of Docker). Some quick googling did not reveal any relevant bugreports for recent Qt versions.
What could be wrong?
Running moc under strace shows Operation not permitted on various statx calls, which sheds some light on why exactly it fails (also, related to this question). This pull request is hopefully going to fix this.
Did you try to run the container with the --privileged (see Which capabilities are needed for statx to stop giving EPERM)?

How to include a .dll using Qt Creator

I've followed the steps described in https://wiki.qt.io/How_to_link_to_a_dll
but, somehow I still get undefined reference errors.
This is what I did:
add to my .pro file the library folder path via INCLUDEPATH+=
add to my .pro file the .dll via LIBS+=
include the .dll (in my case "okFrontPanelDLL.h") via #include in my code
I don't know if it matters, but my library is taken from: http://intantech.com/files/RhythmStim_API_Release_170328.zip
and the extracted folder contains a single .dll and multiple source and header files (do i have to add all sources and headers from the library via SOURCES+= and HEADERS+=?).
Currently, I can declare a variable based on a class defined in the library
okCFrontPanel *dev;
but accessing functions defined for the class, e.g. calling the constructor like
dev = new okCFrontPanel;
leads to an undefined reference error.
edit: I tried direcly adding the source and header files form the library into my Sources folder instead of linking the library and the code works fine, so there is (probably) at least nothing wrong with how I am trying to use the functionalities of the library.
edit2: further information:
OS: Win 7 64 bit
Qt version: 5.9.0
compiler: MinGW 32bit
file location: /[PROJECT FOLDER]/mylibrary
#include <QCoreApplication>
#include "myLibrary/okFrontPanelDLL.h"
int main(int argc, char *argv[])
{
// QCoreApplication a(argc, argv);
// return a.exec();
printf("hello world\n");
okCFrontPanel *dev;
dev = new okCFrontPanel;
// dev->BoardModel;
// If only one Opal Kelly board is plugged in to the host computer, we can use this.
dev->OpenBySerial();
// Set XEM6010 PLL to default configuration to produce 100 MHz FPGA clock.
dev->LoadDefaultPLLConfiguration();
// Upload RhythmStim bitfile which is compiled from RhythmStim Verilog code.
dev->ConfigureFPGA("mylibrary/main.bit");
printf("omg dis is working\n");
}

boost compute (opencl wrapper), initial setup problems (qt, g++)

Been trying to compile this sample code: https://github.com/boostorg/compute/blob/master/README.md
I installed QT Creator 5.7 using mingw530
I compiled the boost libraries using
bootstrap.bat gcc
b2 install --prefix="C:\Boostbuild" --toolset=gcc
bjam --build-dir=c:/Dev/Boost/Boost_lib toolset=gcc stage
I installed AMD SDK 3.0, 2.9.1, and 2.9
I even downloaded opencl 1.1, 1.2, and 2.1 cl.hpp and tried to include that.
The compile starts, but I get a slew of errors
C:\Dev\Boost\compute-master\include\boost\compute\device.hpp:80: error: undefined reference to `clRetainDevice#4'
C:\Users\User\Documents\Projects\build-console-test-Desktop_Qt_5_7_0_MinGW_32bit-Debug\debug\main.o:-1: In function `ZN5boost7compute6deviceaSERKS1_':
I tried a simple qt console app, using the code supplied by boost compute
Note: this isn't specific to qt, I've also tried compiling this using
g++ -I/path/to/compute/include sort.cpp -lOpenCL
doing an -I to each of the include's in the main.cpp (see below)
Ideally, I'd like to know how to compile the example given on their page, with includes and all (and relevant amd sdk and/or opencl versions) along with the necessary included libraries.
My qt project file libraries
INCLUDEPATH += C:\Dev\Boost\compute-master\include
INCLUDEPATH += C:/Users/User/Downloads/dev/boost_1_61_0
INCLUDEPATH += "C:\Program Files (x86)\AMD APP SDK\2.9-1\include"
My main.cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <boost/compute.hpp>
//#define CL_USE_DEPRECATED_OPENCL_1_1_APIS
//#undef CL_VERSION_1_2
//#include <C:\Dev\OpenCL\2.1\cl.hpp>
namespace compute = boost::compute;
int main()
{
// get the default compute device
compute::device gpu = compute::system::default_device();
// create a compute context and command queue
compute::context ctx(gpu);
compute::command_queue queue(ctx, gpu);
// generate random numbers on the host
std::vector<float> host_vector(1000000);
std::generate(host_vector.begin(), host_vector.end(), rand);
// create vector on the device
compute::vector<float> device_vector(1000000, ctx);
// copy data to the device
compute::copy(
host_vector.begin(), host_vector.end(), device_vector.begin(), queue
);
// sort data on the device
compute::sort(
device_vector.begin(), device_vector.end(), queue
);
// copy data back to the host
compute::copy(
device_vector.begin(), device_vector.end(), host_vector.begin(), queue
);
return 0;
}
if I uncomment out the include cl.hpp, I get further
C:/Dev/Boost/compute-master/include/boost/compute/allocator/buffer_allocator.hpp:91: undefined reference to `clReleaseMemObject#4'
The "slew of errors" are link errors because the location of the AMP APP SDK libraries (libOpenCL.a in this case) is missing.
E.g. to link to the 32 bit version for MinGw, -lOpenCL becomes:
-L"C:\Program Files (x86)\AMD APP SDK\2.9-1\lib\x86" -lOpenCL
Or you could add the following to your qt .pro file:
# Ensure that the AMDAPPSDKROOT environment variable has been set
OPENCL_ROOT = $$(AMDAPPSDKROOT)
isEmpty(OPENCL_ROOT) {
error("Please set AMDAPPSDKROOT to the location of the AMD APP SDK")
} else {
message(Using Boost from: $$OPENCL_ROOT)
}
INCLUDEPATH += $$OPENCL_ROOT/include
LIBS += -L$${OPENCL_ROOT}/lib/x86
LIBS += -lOpenCL
Note: the AMDAPPSDKROOT environment variable is normally created when you install the AMD APP SDK. In your case it should be set to:
C:\Program Files (x86)\AMD APP SDK\2.9-1\

QT header included but does not find identifier for QSslError

I have downloaded QT 4.8.1 Source(everywhere-commercial-version).
And compiled 64bit Version of QT with Visual Studio 2008 Pro under Windwos 7 64bit.
After that, i created a simple QT Application Project in vs2008.
but if i add the QSslError Class for test in my code like following.
#include <QSslError>
..
Qt64Test::Qt64Test(QWidget* parent, Qt::WFlags flags): QMainWindow(parent, flags)
{
ui.setupUi(this);
QSslError a;
}
then i get C2065 error by compiling.
1>.\qt64test.cpp(10) : error C2065: 'QSslError': undifined identifier
But the header is included!
QTDIR is correctly set. And all QT include path settings are also correctly set.
i don't know why vs2008 compiler does not see this identifier.
the header file(qsslerror.h) look like this:
#ifndef QSSLERROR_H
#define QSSLERROR_H
#include <QtCore/qvariant.h>
#include <QtNetwork/qsslcertificate.h>
QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
QT_MODULE(Network)
#ifndef QT_NO_OPENSSL
class QSslErrorPrivate;
class Q_NETWORK_EXPORT QSslError
{
public:
enum SslError {
NoError,
//..
(And QT_NO_OPENSSL is not defined in my code.)
Probably your Qt build was not configured with OpenSSL support. The define will be in qconfig.h

Qt and using an existing win32 dll

I want to do some development work using Qt. I have built several small apps and followed
some tutorials. All's fine and seems straight forward.
The development to be done involves using existing code that is contained in win32 dlls. I want to reuse this code with minimum fuss and link them into my Qt app. I have the headers, libs and the dlls so I'll be linking at compile time not dynamically at runtime.
I have tried to do this but Qt always complains always complains with link errors similar to:
main.obj:-1: error: LNK2019: unresolved external symbol _imp_Add referenced in function _main
No matter how I tweak the .pro file it always complains.
I've spent many hours googling and found snippets of info. I could not find one answer that told the whole story. What I'm after is a set of steps, a tutorial like sequence that needs to be followed. There may even be an example in the Qt installation examples but I've been unable to find it.
Here is the simple 'knock-up' I've been trying to get to work in order to move on to the main development. It's based on the MS tutorial dll MathsFunc.
The win32 dll:
// Visual Studio 2005
//Funcs.h
#ifdef MATHFUNCS_EXPORTS
#define MATHFUNCSDLL_API __declspec(dllexport)
#else
#define MATHFUNCSDLL_API __declspec(dllimport)
#endif
#ifdef __cplusplus
extern "C" { /* Assume C declarations for C++ */
#endif
// Returns a + b
MATHFUNCSDLL_API double Add(double a, double b);
#ifdef __cplusplus
} /* Assume C declarations for C++ */
#endif
//Funcs.cpp
#include "Funcs.h"
double Add(double a, double b)
{
return a + b;
}
The Qt app that imports the dll.
//main.cpp
#include <QCoreApplication>
#include "../../mathfuncs/funcs.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
double dResult = Add(1.0,2.0);
printf("1 + 2 = %f\n",dResult);
return a.exec();
}
//The Qt project file .por
#-------------------------------------------------
#
# Project created by QtCreator 2013-03-04T09:16:18
#
#-------------------------------------------------
QT += core
QT -= gui
TARGET = Useit
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
INCLUDEPATH += c:/tmp/mathfuncs
HEADERS += c:/tmp/mathfuncs
LIBS += c:/tmp/mathfuncs/MathFuncs.lib
Thanks in advance for any input.
D.

Resources