I'm trying to do some native windows rust programming. I'm using native-windows-gui and native-windows-derive to do it, but if I try to mix that with tokio, I get the following:
No entry point found error for GetWindowSubclass. On console, I get:
error: process didn't exit successfully: `C:\source\myprojectanem\target\debug\myprojectname.exe` (exit code: 0xc0000139, STATUS_ENTRYPOINT_NOT_FOUND)
If I change
#[tokio::main]
async fn main() {
to:
fn main() {
The problem goes away, but obviously I can't use tokio then.
Apparently the problem is due to an incompatibility between the use of certain libraries (winapi and windows-sys) which use different versions of COM. At least so I deduce from the documentation I've read.
There's a workaaround:
On Cargo.toml, use.
[build-dependencies]
embed-manifest = "1.3.1"
And on the root of the project (not the src dir) create a build.rs file with the following content:
use embed_manifest::{embed_manifest, new_manifest};
fn main() {
if std::env::var_os("CARGO_CFG_WINDOWS").is_some() {
embed_manifest(new_manifest("Contoso.Sample")).expect("unable to embed manifest file");
}
println!("cargo:rerun-if-changed=build.rs");
}
This embeds a manifest together with the executable, solving the issue.
You can manually convert a tokio::main to a regular main by constructing a tokio runtime and telling it to block on a top-level future (e.g. an async block).