feat: entirely remove old pure C project
This commit is contained in:
405
legacy/.gitignore
vendored
405
legacy/.gitignore
vendored
@@ -1,405 +0,0 @@
|
|||||||
# Custom ignore
|
|
||||||
# ignore build directory
|
|
||||||
builds/
|
|
||||||
Debug_MB/
|
|
||||||
Debug_UNICODE/
|
|
||||||
Release_UNICODE/
|
|
||||||
|
|
||||||
## Ignore Visual Studio temporary files, build results, and
|
|
||||||
## files generated by popular Visual Studio add-ons.
|
|
||||||
##
|
|
||||||
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
|
|
||||||
|
|
||||||
# User-specific files
|
|
||||||
*.rsuser
|
|
||||||
*.suo
|
|
||||||
*.user
|
|
||||||
*.userosscache
|
|
||||||
*.sln.docstates
|
|
||||||
|
|
||||||
# User-specific files (MonoDevelop/Xamarin Studio)
|
|
||||||
*.userprefs
|
|
||||||
|
|
||||||
# Mono auto generated files
|
|
||||||
mono_crash.*
|
|
||||||
|
|
||||||
# Build results
|
|
||||||
[Dd]ebug/
|
|
||||||
[Dd]ebugPublic/
|
|
||||||
[Rr]elease/
|
|
||||||
[Rr]eleases/
|
|
||||||
x64/
|
|
||||||
x86/
|
|
||||||
[Ww][Ii][Nn]32/
|
|
||||||
[Aa][Rr][Mm]/
|
|
||||||
[Aa][Rr][Mm]64/
|
|
||||||
bld/
|
|
||||||
[Bb]in/
|
|
||||||
[Oo]bj/
|
|
||||||
[Ll]og/
|
|
||||||
[Ll]ogs/
|
|
||||||
|
|
||||||
# Visual Studio 2015/2017 cache/options directory
|
|
||||||
.vs/
|
|
||||||
# Uncomment if you have tasks that create the project's static files in wwwroot
|
|
||||||
#wwwroot/
|
|
||||||
|
|
||||||
# Visual Studio 2017 auto generated files
|
|
||||||
Generated\ Files/
|
|
||||||
|
|
||||||
# MSTest test Results
|
|
||||||
[Tt]est[Rr]esult*/
|
|
||||||
[Bb]uild[Ll]og.*
|
|
||||||
|
|
||||||
# NUnit
|
|
||||||
*.VisualState.xml
|
|
||||||
TestResult.xml
|
|
||||||
nunit-*.xml
|
|
||||||
|
|
||||||
# Build Results of an ATL Project
|
|
||||||
[Dd]ebugPS/
|
|
||||||
[Rr]eleasePS/
|
|
||||||
dlldata.c
|
|
||||||
|
|
||||||
# Benchmark Results
|
|
||||||
BenchmarkDotNet.Artifacts/
|
|
||||||
|
|
||||||
# .NET Core
|
|
||||||
project.lock.json
|
|
||||||
project.fragment.lock.json
|
|
||||||
artifacts/
|
|
||||||
|
|
||||||
# ASP.NET Scaffolding
|
|
||||||
ScaffoldingReadMe.txt
|
|
||||||
|
|
||||||
# StyleCop
|
|
||||||
StyleCopReport.xml
|
|
||||||
|
|
||||||
# Files built by Visual Studio
|
|
||||||
*_i.c
|
|
||||||
*_p.c
|
|
||||||
*_h.h
|
|
||||||
*.ilk
|
|
||||||
*.meta
|
|
||||||
*.obj
|
|
||||||
*.iobj
|
|
||||||
*.pch
|
|
||||||
*.pdb
|
|
||||||
*.ipdb
|
|
||||||
*.pgc
|
|
||||||
*.pgd
|
|
||||||
*.rsp
|
|
||||||
*.sbr
|
|
||||||
*.tlb
|
|
||||||
*.tli
|
|
||||||
*.tlh
|
|
||||||
*.tmp
|
|
||||||
*.tmp_proj
|
|
||||||
*_wpftmp.csproj
|
|
||||||
*.log
|
|
||||||
*.tlog
|
|
||||||
*.vspscc
|
|
||||||
*.vssscc
|
|
||||||
.builds
|
|
||||||
*.pidb
|
|
||||||
*.svclog
|
|
||||||
*.scc
|
|
||||||
|
|
||||||
# Chutzpah Test files
|
|
||||||
_Chutzpah*
|
|
||||||
|
|
||||||
# Visual C++ cache files
|
|
||||||
ipch/
|
|
||||||
*.aps
|
|
||||||
*.ncb
|
|
||||||
*.opendb
|
|
||||||
*.opensdf
|
|
||||||
*.sdf
|
|
||||||
*.cachefile
|
|
||||||
*.VC.db
|
|
||||||
*.VC.VC.opendb
|
|
||||||
|
|
||||||
# Visual Studio profiler
|
|
||||||
*.psess
|
|
||||||
*.vsp
|
|
||||||
*.vspx
|
|
||||||
*.sap
|
|
||||||
|
|
||||||
# Visual Studio Trace Files
|
|
||||||
*.e2e
|
|
||||||
|
|
||||||
# TFS 2012 Local Workspace
|
|
||||||
$tf/
|
|
||||||
|
|
||||||
# Guidance Automation Toolkit
|
|
||||||
*.gpState
|
|
||||||
|
|
||||||
# ReSharper is a .NET coding add-in
|
|
||||||
_ReSharper*/
|
|
||||||
*.[Rr]e[Ss]harper
|
|
||||||
*.DotSettings.user
|
|
||||||
|
|
||||||
# TeamCity is a build add-in
|
|
||||||
_TeamCity*
|
|
||||||
|
|
||||||
# DotCover is a Code Coverage Tool
|
|
||||||
*.dotCover
|
|
||||||
|
|
||||||
# AxoCover is a Code Coverage Tool
|
|
||||||
.axoCover/*
|
|
||||||
!.axoCover/settings.json
|
|
||||||
|
|
||||||
# Coverlet is a free, cross platform Code Coverage Tool
|
|
||||||
coverage*.json
|
|
||||||
coverage*.xml
|
|
||||||
coverage*.info
|
|
||||||
|
|
||||||
# Visual Studio code coverage results
|
|
||||||
*.coverage
|
|
||||||
*.coveragexml
|
|
||||||
|
|
||||||
# NCrunch
|
|
||||||
_NCrunch_*
|
|
||||||
.*crunch*.local.xml
|
|
||||||
nCrunchTemp_*
|
|
||||||
|
|
||||||
# MightyMoose
|
|
||||||
*.mm.*
|
|
||||||
AutoTest.Net/
|
|
||||||
|
|
||||||
# Web workbench (sass)
|
|
||||||
.sass-cache/
|
|
||||||
|
|
||||||
# Installshield output folder
|
|
||||||
[Ee]xpress/
|
|
||||||
|
|
||||||
# DocProject is a documentation generator add-in
|
|
||||||
DocProject/buildhelp/
|
|
||||||
DocProject/Help/*.HxT
|
|
||||||
DocProject/Help/*.HxC
|
|
||||||
DocProject/Help/*.hhc
|
|
||||||
DocProject/Help/*.hhk
|
|
||||||
DocProject/Help/*.hhp
|
|
||||||
DocProject/Help/Html2
|
|
||||||
DocProject/Help/html
|
|
||||||
|
|
||||||
# Click-Once directory
|
|
||||||
publish/
|
|
||||||
|
|
||||||
# Publish Web Output
|
|
||||||
*.[Pp]ublish.xml
|
|
||||||
*.azurePubxml
|
|
||||||
# Note: Comment the next line if you want to checkin your web deploy settings,
|
|
||||||
# but database connection strings (with potential passwords) will be unencrypted
|
|
||||||
*.pubxml
|
|
||||||
*.publishproj
|
|
||||||
|
|
||||||
# Microsoft Azure Web App publish settings. Comment the next line if you want to
|
|
||||||
# checkin your Azure Web App publish settings, but sensitive information contained
|
|
||||||
# in these scripts will be unencrypted
|
|
||||||
PublishScripts/
|
|
||||||
|
|
||||||
# NuGet Packages
|
|
||||||
*.nupkg
|
|
||||||
# NuGet Symbol Packages
|
|
||||||
*.snupkg
|
|
||||||
# The packages folder can be ignored because of Package Restore
|
|
||||||
**/[Pp]ackages/*
|
|
||||||
# except build/, which is used as an MSBuild target.
|
|
||||||
!**/[Pp]ackages/build/
|
|
||||||
# Uncomment if necessary however generally it will be regenerated when needed
|
|
||||||
#!**/[Pp]ackages/repositories.config
|
|
||||||
# NuGet v3's project.json files produces more ignorable files
|
|
||||||
*.nuget.props
|
|
||||||
*.nuget.targets
|
|
||||||
|
|
||||||
# Microsoft Azure Build Output
|
|
||||||
csx/
|
|
||||||
*.build.csdef
|
|
||||||
|
|
||||||
# Microsoft Azure Emulator
|
|
||||||
ecf/
|
|
||||||
rcf/
|
|
||||||
|
|
||||||
# Windows Store app package directories and files
|
|
||||||
AppPackages/
|
|
||||||
BundleArtifacts/
|
|
||||||
Package.StoreAssociation.xml
|
|
||||||
_pkginfo.txt
|
|
||||||
*.appx
|
|
||||||
*.appxbundle
|
|
||||||
*.appxupload
|
|
||||||
|
|
||||||
# Visual Studio cache files
|
|
||||||
# files ending in .cache can be ignored
|
|
||||||
*.[Cc]ache
|
|
||||||
# but keep track of directories ending in .cache
|
|
||||||
!?*.[Cc]ache/
|
|
||||||
|
|
||||||
# Others
|
|
||||||
ClientBin/
|
|
||||||
~$*
|
|
||||||
*~
|
|
||||||
*.dbmdl
|
|
||||||
*.dbproj.schemaview
|
|
||||||
*.jfm
|
|
||||||
*.pfx
|
|
||||||
*.publishsettings
|
|
||||||
orleans.codegen.cs
|
|
||||||
|
|
||||||
# Including strong name files can present a security risk
|
|
||||||
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
|
|
||||||
#*.snk
|
|
||||||
|
|
||||||
# Since there are multiple workflows, uncomment next line to ignore bower_components
|
|
||||||
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
|
|
||||||
#bower_components/
|
|
||||||
|
|
||||||
# RIA/Silverlight projects
|
|
||||||
Generated_Code/
|
|
||||||
|
|
||||||
# Backup & report files from converting an old project file
|
|
||||||
# to a newer Visual Studio version. Backup files are not needed,
|
|
||||||
# because we have git ;-)
|
|
||||||
_UpgradeReport_Files/
|
|
||||||
Backup*/
|
|
||||||
UpgradeLog*.XML
|
|
||||||
UpgradeLog*.htm
|
|
||||||
ServiceFabricBackup/
|
|
||||||
*.rptproj.bak
|
|
||||||
|
|
||||||
# SQL Server files
|
|
||||||
*.mdf
|
|
||||||
*.ldf
|
|
||||||
*.ndf
|
|
||||||
|
|
||||||
# Business Intelligence projects
|
|
||||||
*.rdl.data
|
|
||||||
*.bim.layout
|
|
||||||
*.bim_*.settings
|
|
||||||
*.rptproj.rsuser
|
|
||||||
*- [Bb]ackup.rdl
|
|
||||||
*- [Bb]ackup ([0-9]).rdl
|
|
||||||
*- [Bb]ackup ([0-9][0-9]).rdl
|
|
||||||
|
|
||||||
# Microsoft Fakes
|
|
||||||
FakesAssemblies/
|
|
||||||
|
|
||||||
# GhostDoc plugin setting file
|
|
||||||
*.GhostDoc.xml
|
|
||||||
|
|
||||||
# Node.js Tools for Visual Studio
|
|
||||||
.ntvs_analysis.dat
|
|
||||||
node_modules/
|
|
||||||
|
|
||||||
# Visual Studio 6 build log
|
|
||||||
*.plg
|
|
||||||
|
|
||||||
# Visual Studio 6 workspace options file
|
|
||||||
*.opt
|
|
||||||
|
|
||||||
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
|
||||||
*.vbw
|
|
||||||
|
|
||||||
# Visual Studio 6 auto-generated project file (contains which files were open etc.)
|
|
||||||
*.vbp
|
|
||||||
|
|
||||||
# Visual Studio 6 workspace and project file (working project files containing files to include in project)
|
|
||||||
*.dsw
|
|
||||||
*.dsp
|
|
||||||
|
|
||||||
# Visual Studio 6 technical files
|
|
||||||
*.ncb
|
|
||||||
*.aps
|
|
||||||
|
|
||||||
# Visual Studio LightSwitch build output
|
|
||||||
**/*.HTMLClient/GeneratedArtifacts
|
|
||||||
**/*.DesktopClient/GeneratedArtifacts
|
|
||||||
**/*.DesktopClient/ModelManifest.xml
|
|
||||||
**/*.Server/GeneratedArtifacts
|
|
||||||
**/*.Server/ModelManifest.xml
|
|
||||||
_Pvt_Extensions
|
|
||||||
|
|
||||||
# Paket dependency manager
|
|
||||||
.paket/paket.exe
|
|
||||||
paket-files/
|
|
||||||
|
|
||||||
# FAKE - F# Make
|
|
||||||
.fake/
|
|
||||||
|
|
||||||
# CodeRush personal settings
|
|
||||||
.cr/personal
|
|
||||||
|
|
||||||
# Python Tools for Visual Studio (PTVS)
|
|
||||||
__pycache__/
|
|
||||||
*.pyc
|
|
||||||
|
|
||||||
# Cake - Uncomment if you are using it
|
|
||||||
# tools/**
|
|
||||||
# !tools/packages.config
|
|
||||||
|
|
||||||
# Tabs Studio
|
|
||||||
*.tss
|
|
||||||
|
|
||||||
# Telerik's JustMock configuration file
|
|
||||||
*.jmconfig
|
|
||||||
|
|
||||||
# BizTalk build output
|
|
||||||
*.btp.cs
|
|
||||||
*.btm.cs
|
|
||||||
*.odx.cs
|
|
||||||
*.xsd.cs
|
|
||||||
|
|
||||||
# OpenCover UI analysis results
|
|
||||||
OpenCover/
|
|
||||||
|
|
||||||
# Azure Stream Analytics local run output
|
|
||||||
ASALocalRun/
|
|
||||||
|
|
||||||
# MSBuild Binary and Structured Log
|
|
||||||
*.binlog
|
|
||||||
|
|
||||||
# NVidia Nsight GPU debugger configuration file
|
|
||||||
*.nvuser
|
|
||||||
|
|
||||||
# MFractors (Xamarin productivity tool) working folder
|
|
||||||
.mfractor/
|
|
||||||
|
|
||||||
# Local History for Visual Studio
|
|
||||||
.localhistory/
|
|
||||||
|
|
||||||
# Visual Studio History (VSHistory) files
|
|
||||||
.vshistory/
|
|
||||||
|
|
||||||
# BeatPulse healthcheck temp database
|
|
||||||
healthchecksdb
|
|
||||||
|
|
||||||
# Backup folder for Package Reference Convert tool in Visual Studio 2017
|
|
||||||
MigrationBackup/
|
|
||||||
|
|
||||||
# Ionide (cross platform F# VS Code tools) working folder
|
|
||||||
.ionide/
|
|
||||||
|
|
||||||
# Fody - auto-generated XML schema
|
|
||||||
FodyWeavers.xsd
|
|
||||||
|
|
||||||
# VS Code files for those working on multiple tools
|
|
||||||
.vscode/*
|
|
||||||
!.vscode/settings.json
|
|
||||||
!.vscode/tasks.json
|
|
||||||
!.vscode/launch.json
|
|
||||||
!.vscode/extensions.json
|
|
||||||
*.code-workspace
|
|
||||||
|
|
||||||
# Local History for Visual Studio Code
|
|
||||||
.history/
|
|
||||||
|
|
||||||
# Windows Installer files from build outputs
|
|
||||||
*.cab
|
|
||||||
*.msi
|
|
||||||
*.msix
|
|
||||||
*.msm
|
|
||||||
*.msp
|
|
||||||
|
|
||||||
# JetBrains Rider
|
|
||||||
*.sln.iml
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
# wfassoc
|
|
||||||
|
|
||||||
**W**indows **F**ile **Assoc**iation Library
|
|
||||||
|
|
||||||
**Work In Progress**
|
|
||||||
|
|
||||||
## Introduction
|
|
||||||
|
|
||||||
* wfassoc: Main library
|
|
||||||
* wfassoc_example: A full example about how to use this library
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
|
||||||
# Visual Studio Version 16
|
|
||||||
VisualStudioVersion = 16.0.31702.278
|
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wfassoc", "wfassoc\wfassoc.vcxproj", "{4AAC8F0C-3E1C-4584-B682-05BBF96A813F}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wfassoc_example", "wfassoc_example\wfassoc_example.vcxproj", "{AD275AD7-CBD5-41CA-AB24-BB707B3F7534}"
|
|
||||||
EndProject
|
|
||||||
Global
|
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
|
||||||
Debug_MB|x64 = Debug_MB|x64
|
|
||||||
Debug_MB|x86 = Debug_MB|x86
|
|
||||||
Debug_UNICODE|x64 = Debug_UNICODE|x64
|
|
||||||
Debug_UNICODE|x86 = Debug_UNICODE|x86
|
|
||||||
Release_UNICODE|x64 = Release_UNICODE|x64
|
|
||||||
Release_UNICODE|x86 = Release_UNICODE|x86
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
|
||||||
{4AAC8F0C-3E1C-4584-B682-05BBF96A813F}.Debug_MB|x64.ActiveCfg = Debug|x64
|
|
||||||
{4AAC8F0C-3E1C-4584-B682-05BBF96A813F}.Debug_MB|x64.Build.0 = Debug|x64
|
|
||||||
{4AAC8F0C-3E1C-4584-B682-05BBF96A813F}.Debug_MB|x86.ActiveCfg = Debug|Win32
|
|
||||||
{4AAC8F0C-3E1C-4584-B682-05BBF96A813F}.Debug_MB|x86.Build.0 = Debug|Win32
|
|
||||||
{4AAC8F0C-3E1C-4584-B682-05BBF96A813F}.Debug_UNICODE|x64.ActiveCfg = Debug|x64
|
|
||||||
{4AAC8F0C-3E1C-4584-B682-05BBF96A813F}.Debug_UNICODE|x64.Build.0 = Debug|x64
|
|
||||||
{4AAC8F0C-3E1C-4584-B682-05BBF96A813F}.Debug_UNICODE|x86.ActiveCfg = Debug|Win32
|
|
||||||
{4AAC8F0C-3E1C-4584-B682-05BBF96A813F}.Debug_UNICODE|x86.Build.0 = Debug|Win32
|
|
||||||
{4AAC8F0C-3E1C-4584-B682-05BBF96A813F}.Release_UNICODE|x64.ActiveCfg = Release|x64
|
|
||||||
{4AAC8F0C-3E1C-4584-B682-05BBF96A813F}.Release_UNICODE|x64.Build.0 = Release|x64
|
|
||||||
{4AAC8F0C-3E1C-4584-B682-05BBF96A813F}.Release_UNICODE|x86.ActiveCfg = Release|Win32
|
|
||||||
{4AAC8F0C-3E1C-4584-B682-05BBF96A813F}.Release_UNICODE|x86.Build.0 = Release|Win32
|
|
||||||
{AD275AD7-CBD5-41CA-AB24-BB707B3F7534}.Debug_MB|x64.ActiveCfg = Debug_UNICODE|x64
|
|
||||||
{AD275AD7-CBD5-41CA-AB24-BB707B3F7534}.Debug_MB|x64.Build.0 = Debug_UNICODE|x64
|
|
||||||
{AD275AD7-CBD5-41CA-AB24-BB707B3F7534}.Debug_MB|x86.ActiveCfg = Debug_MB|Win32
|
|
||||||
{AD275AD7-CBD5-41CA-AB24-BB707B3F7534}.Debug_MB|x86.Build.0 = Debug_MB|Win32
|
|
||||||
{AD275AD7-CBD5-41CA-AB24-BB707B3F7534}.Debug_UNICODE|x64.ActiveCfg = Debug_UNICODE|x64
|
|
||||||
{AD275AD7-CBD5-41CA-AB24-BB707B3F7534}.Debug_UNICODE|x64.Build.0 = Debug_UNICODE|x64
|
|
||||||
{AD275AD7-CBD5-41CA-AB24-BB707B3F7534}.Debug_UNICODE|x86.ActiveCfg = Debug_UNICODE|Win32
|
|
||||||
{AD275AD7-CBD5-41CA-AB24-BB707B3F7534}.Debug_UNICODE|x86.Build.0 = Debug_UNICODE|Win32
|
|
||||||
{AD275AD7-CBD5-41CA-AB24-BB707B3F7534}.Release_UNICODE|x64.ActiveCfg = Release_UNICODE|x64
|
|
||||||
{AD275AD7-CBD5-41CA-AB24-BB707B3F7534}.Release_UNICODE|x64.Build.0 = Release_UNICODE|x64
|
|
||||||
{AD275AD7-CBD5-41CA-AB24-BB707B3F7534}.Release_UNICODE|x86.ActiveCfg = Release_UNICODE|Win32
|
|
||||||
{AD275AD7-CBD5-41CA-AB24-BB707B3F7534}.Release_UNICODE|x86.Build.0 = Release_UNICODE|Win32
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
|
||||||
HideSolutionNode = FALSE
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
|
||||||
SolutionGuid = {1AD32362-840E-4399-A7D5-26A0B67A614D}
|
|
||||||
EndGlobalSection
|
|
||||||
EndGlobal
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
LIBRARY wfassoc
|
|
||||||
EXPORTS
|
|
||||||
|
|
||||||
WFInstallApplicationW
|
|
||||||
WFInstallApplicationA
|
|
||||||
WFUninstallApplicationW
|
|
||||||
WFUninstallApplicationA
|
|
||||||
WFGenerateProgIDW
|
|
||||||
WFGenerateProgIDA
|
|
||||||
@@ -1,165 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
|
||||||
<Configuration>Debug</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Release|Win32">
|
|
||||||
<Configuration>Release</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Debug|x64">
|
|
||||||
<Configuration>Debug</Configuration>
|
|
||||||
<Platform>x64</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Release|x64">
|
|
||||||
<Configuration>Release</Configuration>
|
|
||||||
<Platform>x64</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
</ItemGroup>
|
|
||||||
<PropertyGroup Label="Globals">
|
|
||||||
<VCProjectVersion>16.0</VCProjectVersion>
|
|
||||||
<Keyword>Win32Proj</Keyword>
|
|
||||||
<ProjectGuid>{4aac8f0c-3e1c-4584-b682-05bbf96a813f}</ProjectGuid>
|
|
||||||
<RootNamespace>wfassoc</RootNamespace>
|
|
||||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
|
||||||
<CharacterSet>NotSet</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
|
||||||
<CharacterSet>NotSet</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
|
||||||
<ImportGroup Label="ExtensionSettings">
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Label="Shared">
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<PropertyGroup Label="UserMacros" />
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
<LinkIncremental>true</LinkIncremental>
|
|
||||||
<OutDir>$(SolutionDir)builds\Debug\</OutDir>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
<LinkIncremental>false</LinkIncremental>
|
|
||||||
<OutDir>$(SolutionDir)builds\Release\</OutDir>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
|
||||||
<LinkIncremental>true</LinkIncremental>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
|
||||||
<LinkIncremental>false</LinkIncremental>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
<ClCompile>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<SDLCheck>true</SDLCheck>
|
|
||||||
<PreprocessorDefinitions>WIN32;_CRT_SECURE_NO_WARNINGS;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<ConformanceMode>true</ConformanceMode>
|
|
||||||
<CompileAs>CompileAsC</CompileAs>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<SubSystem>Console</SubSystem>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<ModuleDefinitionFile>wfassoc.def</ModuleDefinitionFile>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
<ClCompile>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
|
||||||
<SDLCheck>true</SDLCheck>
|
|
||||||
<PreprocessorDefinitions>WIN32;_CRT_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<ConformanceMode>true</ConformanceMode>
|
|
||||||
<CompileAs>CompileAsC</CompileAs>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<SubSystem>Console</SubSystem>
|
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<ModuleDefinitionFile>wfassoc.def</ModuleDefinitionFile>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
|
||||||
<ClCompile>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<SDLCheck>true</SDLCheck>
|
|
||||||
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<ConformanceMode>true</ConformanceMode>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<SubSystem>Console</SubSystem>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<ModuleDefinitionFile>wfassoc.def</ModuleDefinitionFile>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
|
||||||
<ClCompile>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
|
||||||
<SDLCheck>true</SDLCheck>
|
|
||||||
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<ConformanceMode>true</ConformanceMode>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<SubSystem>Console</SubSystem>
|
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<ModuleDefinitionFile>wfassoc.def</ModuleDefinitionFile>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="wfassoc_utils.h" />
|
|
||||||
<ClInclude Include="wfassoc_core.h" />
|
|
||||||
<ClInclude Include="wfassoc_private.h" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="wfassoc_private.c" />
|
|
||||||
<ClCompile Include="wfassoc_utils.c" />
|
|
||||||
<ClCompile Include="wfassoc_core.c" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<None Include="wfassoc.def" />
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
|
||||||
<ImportGroup Label="ExtensionTargets">
|
|
||||||
</ImportGroup>
|
|
||||||
</Project>
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup>
|
|
||||||
<Filter Include="源文件">
|
|
||||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
|
||||||
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="头文件">
|
|
||||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
|
||||||
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="资源文件">
|
|
||||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
|
||||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
|
||||||
</Filter>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="wfassoc_core.h">
|
|
||||||
<Filter>头文件</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="wfassoc_utils.h">
|
|
||||||
<Filter>头文件</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="wfassoc_private.h">
|
|
||||||
<Filter>头文件</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="wfassoc_core.c">
|
|
||||||
<Filter>源文件</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="wfassoc_utils.c">
|
|
||||||
<Filter>源文件</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="wfassoc_private.c">
|
|
||||||
<Filter>源文件</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<None Include="wfassoc.def">
|
|
||||||
<Filter>源文件</Filter>
|
|
||||||
</None>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
||||||
@@ -1,407 +0,0 @@
|
|||||||
#include "wfassoc_core.h"
|
|
||||||
#include <strsafe.h>
|
|
||||||
#include <ShlObj.h>
|
|
||||||
|
|
||||||
// private function and variable declearions.
|
|
||||||
// the function with _AL tail mean that the value returned by function is allocated from heap and should be free manually.
|
|
||||||
// otherwise, the tail of _NAL mean this function will not allocate any new memeory.
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Convert multi byte string to wide char string
|
|
||||||
/// Notice: this function will allocate memory for returns and it should be released safely.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="source">The string will be converted</param>
|
|
||||||
/// <param name="error">The error happend during converting</param>
|
|
||||||
/// <returns>The string has been converted. If return NULL, it mean that the converting failed.</returns>
|
|
||||||
//WFERROR ConvMultiByteToWideChar(CHAR* source);
|
|
||||||
WFERROR WFSplitAppPath(WFString* app_path, WFString* app_name, WFString* base_path);
|
|
||||||
//WFERROR Strcat(WCHAR* str1, WCHAR* str2);
|
|
||||||
//WFERROR WFGetBasePathFromAppPath(WFString* app_path, WFString* base_path);
|
|
||||||
WFERROR WFSplitSupportedTypesString(wchar_t* typesString, WFLinkedList* list);
|
|
||||||
|
|
||||||
void WFPrintflnInDebug();
|
|
||||||
|
|
||||||
// some effective reg function
|
|
||||||
LSTATUS WFRegOpenKeyWithCreation(HKEY hkey, LPCWSTR lpSubKey, PHKEY phkResult);
|
|
||||||
LSTATUS WFRegSetStringValue(HKEY hkey, LPCWSTR lpValueName, const WCHAR* data);
|
|
||||||
|
|
||||||
#define LEGACY_PROGID_FORMAT L"%s.%s.%d"
|
|
||||||
#define WFALLOC(type,count) (type*)malloc(sizeof(type)*count);
|
|
||||||
#define SAFE_EXEC_WIN32(wfError, recvError, skipLabel, function) recvError=function; if(recvError!=ERROR_SUCCESS) {wfError = WFERROR_WIN32;goto skipLabel;}
|
|
||||||
#define SAFE_EXEC_WF_LABEL(wfError, skipLabel, function) if((wfError=function)!=WFERROR_OK) {goto skipLabel;}
|
|
||||||
#define SAFE_EXEC_WF_RETURN(wfError, function) if((wfError=function)!=WFERROR_OK) {return wfError;}
|
|
||||||
#define SAFE_EXEC_STRALLOC(wfError, skipLabel, vStr, function) vStr=function; if(vStr==NULL) {wfError = WFERROR_ALLOC;goto skipLabel;}
|
|
||||||
#define SAFE_FREE_PTR(obj) if(obj!=NULL){free(obj);obj=NULL;}
|
|
||||||
#define SAFE_FREE_HKEY(hkey) if(hkey!=NULL&&hkey!=INVALID_HANDLE_VALUE){RegCloseKey(hkey);hkey=NULL;}
|
|
||||||
|
|
||||||
// public function implements.
|
|
||||||
|
|
||||||
WFERROR WFInstallApplication(WFAPP_PROFILE* profile) {
|
|
||||||
if (profile->WFVersion != WFVERSION) return WFERROR_INVALID_VERSION;
|
|
||||||
|
|
||||||
WFERROR wf_error = WFERROR_OK;
|
|
||||||
LSTATUS win32_error = ERROR_SUCCESS;
|
|
||||||
//WCHAR* itemSupportedTypes = NULL;
|
|
||||||
|
|
||||||
// ==================================
|
|
||||||
// generate necessary data
|
|
||||||
|
|
||||||
// init string
|
|
||||||
WFString* strProgID = NULL,
|
|
||||||
* strAppPath = NULL,
|
|
||||||
* strAppBasePath = NULL,
|
|
||||||
* strAppFileName = NULL;
|
|
||||||
|
|
||||||
SAFE_EXEC_WF_LABEL(wf_error, final_process,
|
|
||||||
WFString_Alloc(&strProgID)
|
|
||||||
);
|
|
||||||
SAFE_EXEC_WF_LABEL(wf_error, final_process,
|
|
||||||
WFString_Alloc_Wchar(&strAppPath, profile->AppPath)
|
|
||||||
);
|
|
||||||
SAFE_EXEC_WF_LABEL(wf_error, final_process,
|
|
||||||
WFString_Alloc(&strAppBasePath)
|
|
||||||
);
|
|
||||||
SAFE_EXEC_WF_LABEL(wf_error, final_process,
|
|
||||||
WFString_Alloc(&strAppFileName)
|
|
||||||
);
|
|
||||||
|
|
||||||
// write string
|
|
||||||
SAFE_EXEC_WF_LABEL(wf_error, final_process,
|
|
||||||
WFString_Printf(strProgID, LEGACY_PROGID_FORMAT, profile->ProgID_Vendor, profile->ProgID_Component, profile->ProgID_Version)
|
|
||||||
);
|
|
||||||
SAFE_EXEC_WF_LABEL(wf_error, final_process,
|
|
||||||
WFSplitAppPath(strAppPath, strAppFileName, strAppBasePath)
|
|
||||||
);
|
|
||||||
|
|
||||||
WFString* regpathAppPaths = NULL,
|
|
||||||
* regpathApplicationsRealName = NULL,
|
|
||||||
* regpathApplicationsProgId = NULL;
|
|
||||||
|
|
||||||
SAFE_EXEC_WF_LABEL(wf_error, final_process,
|
|
||||||
WFString_Alloc_Wchar(®pathAppPaths, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\")
|
|
||||||
);
|
|
||||||
SAFE_EXEC_WF_LABEL(wf_error, final_process,
|
|
||||||
WFString_Concat_String(regpathAppPaths, strAppFileName)
|
|
||||||
);
|
|
||||||
|
|
||||||
SAFE_EXEC_WF_LABEL(wf_error, final_process,
|
|
||||||
WFString_Alloc_Wchar(®pathApplicationsRealName, L"SOFTWARE\\Classes\\Applications\\")
|
|
||||||
);
|
|
||||||
SAFE_EXEC_WF_LABEL(wf_error, final_process,
|
|
||||||
WFString_Concat_String(regpathApplicationsRealName, strAppFileName)
|
|
||||||
);
|
|
||||||
|
|
||||||
SAFE_EXEC_WF_LABEL(wf_error, final_process,
|
|
||||||
WFString_Alloc_Wchar(®pathApplicationsProgId, L"SOFTWARE\\Classes\\Applications\\")
|
|
||||||
);
|
|
||||||
SAFE_EXEC_WF_LABEL(wf_error, final_process,
|
|
||||||
WFString_Concat_String(regpathApplicationsProgId, strProgID)
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
//WCHAR* strAppPath = NULL,
|
|
||||||
// * strPath = NULL,
|
|
||||||
// * strApplications = NULL,
|
|
||||||
// * strProgID = NULL,
|
|
||||||
// * strOpenWithList = NULL;
|
|
||||||
//SAFE_EXEC_STRALLOC(error, final_process,
|
|
||||||
// strPath, GetPathFromAppPath_AL(profile->AppPath)
|
|
||||||
//);
|
|
||||||
//SAFE_EXEC_STRALLOC(error, final_process,
|
|
||||||
// strAppPath, Strcat_AL(
|
|
||||||
// L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\",
|
|
||||||
// GetAppNameFromAppPath_NAL(profile->AppPath)
|
|
||||||
//)
|
|
||||||
//);
|
|
||||||
//SAFE_EXEC_STRALLOC(error, final_process,
|
|
||||||
// strProgID, Strcat_AL(
|
|
||||||
// L"SOFTWARE\\Classes\\Applications\\",
|
|
||||||
// profile->ProgID
|
|
||||||
//)
|
|
||||||
//);
|
|
||||||
//SAFE_EXEC_STRALLOC(error, final_process,
|
|
||||||
// strApplications, Strcat_AL(
|
|
||||||
// L"SOFTWARE\\Classes\\Applications\\",
|
|
||||||
// GetAppNameFromAppPath_NAL(profile->AppPath)
|
|
||||||
//)
|
|
||||||
//);
|
|
||||||
|
|
||||||
// generate necessary HKEY
|
|
||||||
HKEY nodeAppPath = NULL,
|
|
||||||
nodeApplications = NULL,
|
|
||||||
nodeApplications_Verb = NULL,
|
|
||||||
nodeApplications_SupportedTypes = NULL,
|
|
||||||
nodeProgID = NULL,
|
|
||||||
nodeProgID_Verb = NULL,
|
|
||||||
nodeClasses = NULL,
|
|
||||||
nodeExt = NULL,
|
|
||||||
nodeExt_OpenWithProgIds = NULL,
|
|
||||||
nodeExt_OpenWithList = NULL;
|
|
||||||
|
|
||||||
// register in `App Paths`
|
|
||||||
SAFE_EXEC_WIN32(error, win32_error, final_process,
|
|
||||||
WFRegOpenKeyWithCreation(profile->RegisterForAllUsers ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER, strAppPath, &nodeAppPath)
|
|
||||||
);
|
|
||||||
SAFE_EXEC_WIN32(error, win32_error, final_process,
|
|
||||||
WFRegOpenKeyWithCreation(profile->RegisterForAllUsers ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER, strApplications, &nodeApplications)
|
|
||||||
);
|
|
||||||
SAFE_EXEC_WIN32(error, win32_error, final_process,
|
|
||||||
WFRegOpenKeyWithCreation(nodeApplications, L"shell\\open\\command", &nodeApplications_Verb)
|
|
||||||
);
|
|
||||||
SAFE_EXEC_WIN32(error, win32_error, final_process,
|
|
||||||
WFRegOpenKeyWithCreation(nodeApplications, L"SupportedTypes", &nodeApplications_SupportedTypes)
|
|
||||||
);
|
|
||||||
SAFE_EXEC_WIN32(error, win32_error, final_process,
|
|
||||||
WFRegOpenKeyWithCreation(profile->RegisterForAllUsers ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER, strProgID, &nodeProgID)
|
|
||||||
);
|
|
||||||
SAFE_EXEC_WIN32(error, win32_error, final_process,
|
|
||||||
WFRegOpenKeyWithCreation(nodeProgID, L"shell\\open\\command", &nodeProgID_Verb)
|
|
||||||
);
|
|
||||||
SAFE_EXEC_WIN32(error, win32_error, final_process,
|
|
||||||
WFRegOpenKeyWithCreation(profile->RegisterForAllUsers ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER, L"SOFTWARE\\Classes", &nodeClasses)
|
|
||||||
);
|
|
||||||
|
|
||||||
// operate HKEY
|
|
||||||
SAFE_EXEC_WIN32(error, win32_error, final_process,
|
|
||||||
WFRegSetStringValue(nodeAppPath, NULL, profile->AppPath) // visit Default key
|
|
||||||
);
|
|
||||||
SAFE_EXEC_WIN32(error, win32_error, final_process,
|
|
||||||
WFRegSetStringValue(nodeAppPath, L"Path", strPath)
|
|
||||||
);
|
|
||||||
|
|
||||||
SAFE_EXEC_WIN32(error, win32_error, final_process,
|
|
||||||
WFRegSetStringValue(nodeApplications_Verb, NULL, profile->AppCommand) // visit Default key
|
|
||||||
);
|
|
||||||
|
|
||||||
SAFE_EXEC_WIN32(error, win32_error, final_process,
|
|
||||||
WFRegSetStringValue(nodeProgID_Verb, NULL, profile->AppCommand) // visit Default key
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
while ((itemSupportedTypes = IterateSupportedTypesString_NAL(profile->SupportedTypes, itemSupportedTypes)) != NULL) {
|
|
||||||
SAFE_EXEC_WIN32(error, win32_error, final_process,
|
|
||||||
WFRegSetStringValue(nodeApplications_SupportedTypes, itemSupportedTypes, NULL) // register supported type with blank item
|
|
||||||
);
|
|
||||||
|
|
||||||
SAFE_EXEC_WIN32(error, win32_error, final_process,
|
|
||||||
WFRegOpenKeyWithCreation(nodeClasses, itemSupportedTypes, &nodeExt)
|
|
||||||
);
|
|
||||||
if (profile->SetAsDefault) {
|
|
||||||
SAFE_EXEC_WIN32(error, win32_error, final_process,
|
|
||||||
WFRegSetStringValue(nodeExt, NULL, profile->ProgID) // visit Default key
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if (profile->ShowInOpenWithMenu) {
|
|
||||||
if (profile->UseOpenWithList) {
|
|
||||||
// use Windows XP node
|
|
||||||
SAFE_EXEC_STRALLOC(error, final_process,
|
|
||||||
strOpenWithList, Strcat_AL(
|
|
||||||
L"OpenWithList\\",
|
|
||||||
GetAppNameFromAppPath_NAL(profile->AppPath)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
SAFE_EXEC_WIN32(error, win32_error, final_process,
|
|
||||||
WFRegOpenKeyWithCreation(nodeExt, itemSupportedTypes, &nodeExt_OpenWithList);
|
|
||||||
);
|
|
||||||
|
|
||||||
SAFE_FREE_PTR(strOpenWithList);
|
|
||||||
SAFE_FREE_HKEY(nodeExt_OpenWithList);
|
|
||||||
} else {
|
|
||||||
// use Windows Vista node
|
|
||||||
SAFE_EXEC_WIN32(error, win32_error, final_process,
|
|
||||||
WFRegOpenKeyWithCreation(nodeExt, itemSupportedTypes, &nodeExt_OpenWithProgIds);
|
|
||||||
);
|
|
||||||
SAFE_EXEC_WIN32(error, win32_error, final_process,
|
|
||||||
WFRegSetStringValue(nodeExt_OpenWithProgIds, profile->ProgID, NULL)
|
|
||||||
);
|
|
||||||
|
|
||||||
SAFE_FREE_HKEY(nodeExt_OpenWithProgIds);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SAFE_FREE_HKEY(nodeExt);
|
|
||||||
}
|
|
||||||
|
|
||||||
final_process:
|
|
||||||
// free HKEY and strings
|
|
||||||
SAFE_FREE_HKEY(nodeAppPath);
|
|
||||||
SAFE_FREE_HKEY(nodeApplications);
|
|
||||||
SAFE_FREE_HKEY(nodeApplications_Verb);
|
|
||||||
SAFE_FREE_HKEY(nodeApplications_SupportedTypes);
|
|
||||||
SAFE_FREE_HKEY(nodeProgID);
|
|
||||||
SAFE_FREE_HKEY(nodeProgID_Verb);
|
|
||||||
SAFE_FREE_HKEY(nodeClasses);
|
|
||||||
SAFE_FREE_HKEY(nodeExt);
|
|
||||||
SAFE_FREE_HKEY(nodeExt_OpenWithProgIds);
|
|
||||||
SAFE_FREE_HKEY(nodeExt_OpenWithList);
|
|
||||||
|
|
||||||
SAFE_FREE_PTR(strAppPath);
|
|
||||||
SAFE_FREE_PTR(strPath);
|
|
||||||
SAFE_FREE_PTR(strApplications);
|
|
||||||
SAFE_FREE_PTR(strProgID);
|
|
||||||
|
|
||||||
// order uninstall to wipe out all written data
|
|
||||||
// if function failed
|
|
||||||
if (error != WFERROR_OK)
|
|
||||||
WFUninstallApplicationW(profile);
|
|
||||||
|
|
||||||
// active changes
|
|
||||||
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL);
|
|
||||||
|
|
||||||
// return error
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
|
||||||
//WFERROR WFInstallApplicationA(WFAPP_PROFILEA* profile) {
|
|
||||||
// return WFERROR_OK;
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//WFERROR WFUninstallApplicationW(WFAPP_PROFILEW* profile) {
|
|
||||||
// if (profile->WFVersion != WFVERSION) return WFERROR_INVALID_VERSION;
|
|
||||||
//
|
|
||||||
// return WFERROR_OK;
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//WFERROR WFUninstallApplicationA(WFAPP_PROFILEA* profile) {
|
|
||||||
// return WFERROR_OK;
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//WFERROR WFGenerateProgIDW(WCHAR* vendor, WCHAR* component, INT version, WCHAR* result, INT* result_length) {
|
|
||||||
// if (result_length == NULL) return WFERROR_NULLPTR;
|
|
||||||
// if (result == NULL) {
|
|
||||||
// *result_length = _snwprintf(NULL, 0, LEGACY_PROGID_FORMATW, vendor, component, version) + 1;
|
|
||||||
// } else {
|
|
||||||
// int write_result = _snwprintf(result, *result_length, LEGACY_PROGID_FORMATW, vendor, component, version);
|
|
||||||
// if (write_result < 0 || write_result >= *result_length) return WFERROR_INSUFFICIENT_BUFFER;
|
|
||||||
// }
|
|
||||||
// return WFERROR_OK;
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//WFERROR WFGenerateProgIDA(CHAR* vendor, CHAR* component, INT version, CHAR* result, INT* result_length) {
|
|
||||||
// if (result_length == NULL) return WFERROR_NULLPTR;
|
|
||||||
// if (result == NULL) {
|
|
||||||
// *result_length = _snprintf(NULL, 0, LEGACY_PROGID_FORMATA, vendor, component, version) + 1;
|
|
||||||
// } else {
|
|
||||||
// int write_result = _snprintf(result, *result_length, LEGACY_PROGID_FORMATA, vendor, component, version);
|
|
||||||
// if (write_result < 0 || write_result >= *result_length) return WFERROR_INSUFFICIENT_BUFFER;
|
|
||||||
// }
|
|
||||||
// return WFERROR_OK;
|
|
||||||
//}
|
|
||||||
|
|
||||||
|
|
||||||
// private function and variable implements.
|
|
||||||
|
|
||||||
//WCHAR* ConvMultiByteToWideChar_AL(CHAR* source) {
|
|
||||||
// WCHAR* dest = NULL;
|
|
||||||
// size_t sourceLength = strlen(source);
|
|
||||||
//
|
|
||||||
// int destLength = MultiByteToWideChar(CP_ACP, 0, source, sourceLength, NULL, 0);
|
|
||||||
// if (destLength <= 0) return NULL;
|
|
||||||
// destLength += 10;
|
|
||||||
//
|
|
||||||
// dest = WFALLOC(WCHAR, destLength);
|
|
||||||
// if (dest == NULL) return NULL;
|
|
||||||
//
|
|
||||||
// memset(dest, 0, sizeof(WCHAR) * destLength);
|
|
||||||
// int error = MultiByteToWideChar(CP_ACP, 0, source, sourceLength, dest, destLength);
|
|
||||||
// if (error <= 0) {
|
|
||||||
// free(dest);
|
|
||||||
// return NULL;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// return dest;
|
|
||||||
//}
|
|
||||||
|
|
||||||
WFERROR WFSplitAppPath(WFString* app_path, WFString* app_name, WFString* base_path) {
|
|
||||||
WFERROR ec;
|
|
||||||
wchar_t* lastSlash, *src, *ptr;
|
|
||||||
SAFE_EXEC_WF_RETURN(ec, WFString_GetData(app_path, &ptr));
|
|
||||||
src = lastSlash = ptr;
|
|
||||||
|
|
||||||
while (*ptr != L'\0') {
|
|
||||||
if (*ptr == L'\\' || *ptr == L'/') {
|
|
||||||
lastSlash = ptr;
|
|
||||||
}
|
|
||||||
ptr++;
|
|
||||||
}
|
|
||||||
|
|
||||||
SAFE_EXEC_WF_RETURN(ec, WFString_SubString(app_path, base_path, 0, lastSlash - src));
|
|
||||||
SAFE_EXEC_WF_RETURN(ec, WFString_SetData(app_name, ++lastSlash));
|
|
||||||
return WFERROR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
//WCHAR* Strcat_AL(WCHAR* str1, WCHAR* str2) {
|
|
||||||
// size_t length = wcslen(str1) + wcslen(str2) + 10;
|
|
||||||
//
|
|
||||||
// WCHAR* dest = NULL;
|
|
||||||
// dest = WFALLOC(WCHAR, length);
|
|
||||||
// if (dest == NULL) return NULL;
|
|
||||||
//
|
|
||||||
// wcscpy(dest, str1);
|
|
||||||
// wcscat(dest, str2);
|
|
||||||
// return dest;
|
|
||||||
//}
|
|
||||||
|
|
||||||
WFERROR WFSplitSupportedTypesString(wchar_t* typesString, WFLinkedList* list) {
|
|
||||||
WFERROR ec;
|
|
||||||
wchar_t* ptr;
|
|
||||||
WFString* strl;
|
|
||||||
uint32_t len_str;
|
|
||||||
ptr = typesString;
|
|
||||||
|
|
||||||
while (*ptr != L'\0') {
|
|
||||||
// add into list
|
|
||||||
SAFE_EXEC_WF_RETURN(ec, WFString_Alloc(&strl, ptr));
|
|
||||||
SAFE_EXEC_WF_RETURN(ec, WFLinkedList_Add(list, strl));
|
|
||||||
|
|
||||||
// shift to next string
|
|
||||||
SAFE_EXEC_WF_RETURN(ec, WFString_GetLength(strl, &len_str));
|
|
||||||
ptr += len_str + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return WFERROR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
//WCHAR* IterateSupportedTypesString_NAL(WCHAR* typesString, WCHAR* prev) {
|
|
||||||
// if (typesString == NULL || *typesString == L'\0') return NULL;
|
|
||||||
// if (prev == NULL) return typesString;
|
|
||||||
//
|
|
||||||
// // skip prev string
|
|
||||||
// while (*prev != L'\0') {
|
|
||||||
// prev++;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// // if the next string is start with zero, it mean that the full string is over and return NULL to terminate analyse.
|
|
||||||
// // otherwise return next string
|
|
||||||
// prev++;
|
|
||||||
// if (*prev == L'\0') return NULL;
|
|
||||||
// else return prev;
|
|
||||||
//}
|
|
||||||
|
|
||||||
void WFPrintflnInDebug() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
LSTATUS WFRegOpenKeyWithCreation(HKEY hkey, LPCWSTR lpSubKey, PHKEY phkResult) {
|
|
||||||
return RegCreateKeyExW(
|
|
||||||
hkey,
|
|
||||||
lpSubKey,
|
|
||||||
0,
|
|
||||||
NULL,
|
|
||||||
REG_OPTION_NON_VOLATILE,
|
|
||||||
KEY_ALL_ACCESS,
|
|
||||||
NULL,
|
|
||||||
phkResult,
|
|
||||||
NULL
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
LSTATUS WFRegSetStringValue(HKEY hkey, LPCWSTR lpValueName, const WCHAR* data) {
|
|
||||||
return RegSetValueExW(
|
|
||||||
hkey,
|
|
||||||
lpValueName,
|
|
||||||
0,
|
|
||||||
REG_SZ,
|
|
||||||
data,
|
|
||||||
data == NULL ? 0 : ((wcslen(data) + 1) * sizeof(WCHAR))
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
#if !defined(_YYCDLL_WFASSOC_H__IMPORTED_)
|
|
||||||
#define _YYCDLL_WFASSOC_H__IMPORTED_
|
|
||||||
|
|
||||||
#include <Windows.h>
|
|
||||||
#include <sal.h>
|
|
||||||
#include "wfassoc_utils.h"
|
|
||||||
|
|
||||||
// quick marco for developer and should not be used in wfassoc self
|
|
||||||
|
|
||||||
//#if defined(_UNICODE)
|
|
||||||
//#define WFAPP_PROFILE WFAPP_PROFILEW
|
|
||||||
//#define WFInstallApplication WFInstallApplicationW
|
|
||||||
//#define WFUninstallApplication WFUninstallApplicationW
|
|
||||||
//#define WFGenerateProgID WFGenerateProgIDW
|
|
||||||
//#elif defined(_MBCS)
|
|
||||||
//#define WFAPP_PROFILE WFAPP_PROFILEA
|
|
||||||
//#define WFInstallApplication WFInstallApplicationA
|
|
||||||
//#define WFUninstallApplication WFUninstallApplicationA
|
|
||||||
//#define WFGenerateProgID WFGenerateProgIDA
|
|
||||||
//#endif
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Install Application via Wide Character
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="profile"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
WFERROR WFInstallApplication(WFAPP_PROFILE* profile);
|
|
||||||
WFERROR WFUninstallApplication(WFAPP_PROFILE* profile);
|
|
||||||
|
|
||||||
WFERROR WFRegisterAppPath(WFAPP_INTERNAL_PROFILE* internal_profile);
|
|
||||||
WFERROR WFRegisterApplication(WFAPP_INTERNAL_PROFILE* internal_profile);
|
|
||||||
WFERROR WFRegisterExtensions(WFAPP_INTERNAL_PROFILE* internal_profile);
|
|
||||||
|
|
||||||
//WFERROR WFProfile_Alloc(WFAPP_PROFILE** profile);
|
|
||||||
//WFERROR WFProfile_Free(WFAPP_PROFILE* profile);
|
|
||||||
//WFERROR WFProfile_SetProgIDA(WFAPP_PROFILE** profile, char* vendor, char* component, uint32_t version, BOOL is_utf8);
|
|
||||||
//WFERROR WFProfile_SetProgIDW(WFAPP_PROFILE** profile, wchar_t* vendor, wchar_t* component, uint32_t version);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Generate Legacy ProgID
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="vendor">Vendor. Such as `Word`, `Excel`, `PowerPoint`.</param>
|
|
||||||
/// <param name="component">Component. Such as `Document`, `Sheet`, `Diagram`.</param>
|
|
||||||
/// <param name="version">Version. Such as `0`, `1`, `114514`.</param>
|
|
||||||
/// <param name="result">Pointer to output ProgID. If this variable is NULL, function will calculate proper length of receiving buffer and return it via `result_length`.</param>
|
|
||||||
/// <param name="result_length">Pointer to a int variable containing buffer's length. If `result` is not NULL, it should be the length of `result`.</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
//WFERROR WFGenerateProgIDW(WCHAR* vendor, WCHAR* component, INT version, WCHAR* result, INT* result_length);
|
|
||||||
/// <summary>
|
|
||||||
/// Generate Legacy ProgID
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="vendor">Vendor. Such as `Word`, `Excel`, `PowerPoint`.</param>
|
|
||||||
/// <param name="component">Component. Such as `Document`, `Sheet`, `Diagram`.</param>
|
|
||||||
/// <param name="version">Version. Such as `0`, `1`, `114514`.</param>
|
|
||||||
/// <param name="result">Pointer to output ProgID. If this variable is NULL, function will calculate proper length of receiving buffer and return it via `result_length`.</param>
|
|
||||||
/// <param name="result_length">Pointer to a int variable containing buffer's length. If `result` is not NULL, it should be the length of `result`.</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
//WFERROR WFGenerateProgIDA(CHAR* vendor, CHAR* component, INT version, CHAR* result, INT* result_length);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
#include "wfassoc_private.h"
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
#if !defined(_YYCDLL_WFASSOC_PRIVATE_H__IMPORTED_)
|
|
||||||
#define _YYCDLL_WFASSOC_PRIVATE_H__IMPORTED_
|
|
||||||
|
|
||||||
typedef struct _WFAPP_RAWDATA {
|
|
||||||
uint32_t mVersion;
|
|
||||||
|
|
||||||
}WFAPP_RAWDATA;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,256 +0,0 @@
|
|||||||
#include "wfassoc_utils.h"
|
|
||||||
|
|
||||||
#pragma region WFString
|
|
||||||
|
|
||||||
WFERROR WFString_Alloc_Wchar(WFString** strl, const wchar_t* raw_data) {
|
|
||||||
if (raw_data == NULL) return WFERROR_NULLPTR;
|
|
||||||
|
|
||||||
WFERROR ec;
|
|
||||||
if ((ec = WFString_Alloc(strl)) != WFERROR_OK) return ec;
|
|
||||||
if ((ec = WFString_SetData(*strl, raw_data)) != WFERROR_OK) return ec;
|
|
||||||
return WFERROR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
WFERROR WFString_Alloc_Char(WFString** strl, const char* raw_data, BOOL is_utf8) {
|
|
||||||
if (raw_data == NULL) return WFERROR_NULLPTR;
|
|
||||||
|
|
||||||
// init string
|
|
||||||
WFERROR ec;
|
|
||||||
if ((ec = WFString_Alloc(strl)) != WFERROR_OK) return ec;
|
|
||||||
|
|
||||||
// compute expected string length
|
|
||||||
uint32_t sourceLength = strlen(raw_data);
|
|
||||||
int destLength = MultiByteToWideChar(is_utf8 ? CP_UTF8 : CP_ACP, 0, raw_data, sourceLength, NULL, 0);
|
|
||||||
if (destLength <= 0) return WFERROR_CRT;
|
|
||||||
--destLength; // remove terminal char
|
|
||||||
|
|
||||||
// resize string
|
|
||||||
if ((ec = WFString_Resize(*strl, destLength)) != WFERROR_OK) return ec;
|
|
||||||
|
|
||||||
// clear buffer and write data
|
|
||||||
wchar_t* buffer;
|
|
||||||
if ((ec = WFString_GetData(*strl, &buffer)) != WFERROR_OK) return ec;
|
|
||||||
memset(buffer, 0, sizeof(WCHAR) * destLength);
|
|
||||||
int crt_error = MultiByteToWideChar(is_utf8 ? CP_UTF8 : CP_ACP, 0, raw_data, sourceLength, buffer, destLength);
|
|
||||||
if (crt_error <= 0) return WFERROR_CRT;
|
|
||||||
|
|
||||||
return WFERROR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
WFERROR WFString_Alloc_Capacity(WFString** strl, uint32_t size) {
|
|
||||||
*strl = WFNEW(WFString);
|
|
||||||
if (*strl == NULL) return WFERROR_ALLOC;
|
|
||||||
|
|
||||||
// init struct data
|
|
||||||
(*strl)->mCapacity = size;
|
|
||||||
(*strl)->mRealCapacity = size + 1;
|
|
||||||
(*strl)->mLength = 0;
|
|
||||||
(*strl)->mRealLength = 1;
|
|
||||||
|
|
||||||
(*strl)->mRawData = malloc((*strl)->mRealCapacity * sizeof(wchar_t));
|
|
||||||
if ((*strl)->mRawData == NULL) return WFERROR_ALLOC;
|
|
||||||
|
|
||||||
(*strl)->mRawData[(*strl)->mRealLength - 1] = 0;
|
|
||||||
|
|
||||||
return WFERROR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
WFERROR WFString_Alloc(WFString** strl) {
|
|
||||||
return WFString_Alloc_Capacity(strl, 256);
|
|
||||||
}
|
|
||||||
|
|
||||||
WFERROR WFString_Free(WFString* strl) {
|
|
||||||
if (strl == NULL) return WFERROR_OK;
|
|
||||||
if (strl->mRawData == NULL) return WFERROR_NULLPTR;
|
|
||||||
free(strl->mRawData);
|
|
||||||
free(strl);
|
|
||||||
return WFERROR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
WFERROR WFString_Resize(WFString* strl, uint32_t new_size) {
|
|
||||||
// if remain data is not enough, we need alloc new one
|
|
||||||
if (new_size >= strl->mCapacity) {
|
|
||||||
strl->mCapacity = new_size * 2;
|
|
||||||
strl->mRealCapacity = strl->mCapacity + 1;
|
|
||||||
|
|
||||||
// alloc buffer
|
|
||||||
if (strl->mRawData != NULL)
|
|
||||||
strl->mRawData = realloc(strl->mRawData, strl->mRealCapacity * sizeof(wchar_t));
|
|
||||||
else
|
|
||||||
strl->mRawData = malloc(strl->mRealCapacity * sizeof(wchar_t));
|
|
||||||
if (strl->mRawData == NULL) return WFERROR_ALLOC;
|
|
||||||
}
|
|
||||||
|
|
||||||
// set length as new length
|
|
||||||
strl->mLength = new_size;
|
|
||||||
strl->mRealLength = strl->mLength + 1;
|
|
||||||
|
|
||||||
// set the last one is zero
|
|
||||||
strl->mRawData[strl->mRealLength - 1] = 0;
|
|
||||||
return WFERROR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
WFERROR WFString_GetData(WFString* strl, wchar_t** pdata) {
|
|
||||||
if (strl == NULL) return WFERROR_NULLPTR;
|
|
||||||
*pdata = strl->mRawData;
|
|
||||||
return WFERROR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
WFERROR WFString_SetData(WFString* strl, const wchar_t* data) {
|
|
||||||
if (strl == NULL || data == NULL) return WFERROR_NULLPTR;
|
|
||||||
|
|
||||||
// get length and resize buffer
|
|
||||||
WFERROR ec;
|
|
||||||
uint32_t size = wcslen(data);
|
|
||||||
ec = WFString_Resize(strl, size);
|
|
||||||
if (ec != WFERROR_OK) return ec;
|
|
||||||
|
|
||||||
// copy data
|
|
||||||
if (size != 0)
|
|
||||||
memcpy(strl->mRawData, data, sizeof(wchar_t) * size);
|
|
||||||
|
|
||||||
return WFERROR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
WFERROR WFString_GetLength(WFString* strl, uint32_t* len) {
|
|
||||||
if (strl == NULL) return WFERROR_NULLPTR;
|
|
||||||
*len = strl->mLength;
|
|
||||||
return WFERROR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
WFERROR WFString_Printf(WFString* strl, const wchar_t* format, ...) {
|
|
||||||
if (strl == NULL) return WFERROR_NULLPTR;
|
|
||||||
|
|
||||||
// get expected size
|
|
||||||
va_list argptr;
|
|
||||||
va_start(argptr, format);
|
|
||||||
uint32_t count = _vsnwprintf(NULL, 0, format, argptr);
|
|
||||||
//count++;
|
|
||||||
va_end(argptr);
|
|
||||||
|
|
||||||
// resize string and get buffer ptr
|
|
||||||
WFERROR ec;
|
|
||||||
wchar_t* buffer;
|
|
||||||
if ((ec = WFString_Resize(strl, count)) != WFERROR_OK) return ec;
|
|
||||||
if ((ec = WFString_GetData(strl, &buffer)) != WFERROR_OK) return ec;
|
|
||||||
|
|
||||||
// write data to buffer
|
|
||||||
buffer[count - 1] = L'\0';
|
|
||||||
va_start(argptr, format);
|
|
||||||
int write_result = _vsnwprintf(buffer, count, format, argptr);
|
|
||||||
va_end(argptr);
|
|
||||||
if (write_result < 0 || write_result >= count) return WFERROR_CRT;
|
|
||||||
|
|
||||||
return WFERROR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
WFERROR WFString_Concat_Wchar(WFString* strl, const wchar_t* extra) {
|
|
||||||
if (strl == NULL) return WFERROR_NULLPTR;
|
|
||||||
if (extra == NULL) return WFERROR_OK;
|
|
||||||
|
|
||||||
uint32_t count = wcslen(extra);
|
|
||||||
uint32_t oldlen = strl->mLength;
|
|
||||||
|
|
||||||
// if extra strl count is 0, do not copy any data.
|
|
||||||
if (count == 0) return WFERROR_OK;
|
|
||||||
|
|
||||||
WFERROR ec;
|
|
||||||
if ((ec = WFString_Resize(strl, oldlen + count)) != WFERROR_OK) return ec;
|
|
||||||
memcpy(strl->mRawData + oldlen, extra, sizeof(wchar_t) * count);
|
|
||||||
return WFERROR_OK;
|
|
||||||
}
|
|
||||||
WFERROR WFString_Concat_String(WFString* strl, WFString* extra) {
|
|
||||||
if (strl == NULL) return WFERROR_NULLPTR;
|
|
||||||
if (extra == NULL) return WFERROR_OK;
|
|
||||||
|
|
||||||
return WFString_Concat_Wchar(strl, extra->mRawData);
|
|
||||||
}
|
|
||||||
|
|
||||||
WFERROR WFString_SubString(WFString* strl, WFString* substring, uint32_t start_index, uint32_t length) {
|
|
||||||
if (strl == NULL) return WFERROR_NULLPTR;
|
|
||||||
if (start_index >= strl->mLength || length > strl->mLength - start_index) return WFERROR_INVALID_ARGUMENTS;
|
|
||||||
|
|
||||||
WFERROR ec;
|
|
||||||
if ((ec = WFString_Resize(substring, length)) != WFERROR_OK) return ec;
|
|
||||||
if (length != 0) {
|
|
||||||
memcpy(substring->mRawData, strl->mRawData + start_index, sizeof(wchar_t) * length);
|
|
||||||
}
|
|
||||||
return WFERROR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
#pragma endregion
|
|
||||||
|
|
||||||
#pragma region WFLinkedList
|
|
||||||
|
|
||||||
WFERROR WFLinkedList_Alloc(WFLinkedList** list) {
|
|
||||||
*list = WFNEW(WFLinkedList);
|
|
||||||
if (*list == NULL) return WFERROR_ALLOC;
|
|
||||||
return WFERROR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
WFERROR WFLinkedList_Free(WFLinkedList* list) {
|
|
||||||
return WFLinkedList_Free_Full(list, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
WFERROR WFLinkedList_Free_Full(WFLinkedList* list, WFLinkedListNode_FreeDataFunc free_func) {
|
|
||||||
if (list == NULL) return WFERROR_OK;
|
|
||||||
|
|
||||||
// iterate full list and remove data and node
|
|
||||||
WFLinkedListNode* node = list->mHead, * free_node = NULL;
|
|
||||||
while (node != NULL) {
|
|
||||||
// free raw data
|
|
||||||
if (free_func != NULL) (*free_func)(node->mRawData);
|
|
||||||
// move to next node and free current node
|
|
||||||
free_node = node;
|
|
||||||
node = node->mNext;
|
|
||||||
free(free_node);
|
|
||||||
}
|
|
||||||
|
|
||||||
// free list self
|
|
||||||
free(list);
|
|
||||||
|
|
||||||
return WFERROR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
WFERROR WFLinkedList_Add(WFLinkedList* list, void* data) {
|
|
||||||
if (list == NULL) return WFERROR_NULLPTR;
|
|
||||||
|
|
||||||
WFLinkedListNode* new_item = WFNEW(WFLinkedListNode);
|
|
||||||
if (new_item == NULL) return WFERROR_ALLOC;
|
|
||||||
new_item->mNext = NULL;
|
|
||||||
new_item->mRawData = data;
|
|
||||||
|
|
||||||
if (list->mLength == 0) {
|
|
||||||
list->mHead = list->mTail = new_item;
|
|
||||||
} else {
|
|
||||||
list->mTail->mNext = new_item;
|
|
||||||
list->mTail = new_item;
|
|
||||||
}
|
|
||||||
++list->mLength;
|
|
||||||
return WFERROR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
WFERROR WFLinkedList_NodeIterator(WFLinkedList* list, WFLinkedListNode** node_ptr) {
|
|
||||||
if (list == NULL) return WFERROR_NULLPTR;
|
|
||||||
|
|
||||||
if (*node_ptr == NULL) {
|
|
||||||
// if node_ptr is NULL, it mean that wo should iterate this list from head
|
|
||||||
*node_ptr = list->mHead;
|
|
||||||
} else {
|
|
||||||
// otherwise, move to next node
|
|
||||||
*node_ptr = (*node_ptr)->mNext;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if the header is null, return end of tail error to notice caller stop iterate
|
|
||||||
if (*node_ptr == NULL) return WFERROR_END_OF_TAIL;
|
|
||||||
else return WFERROR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
WFERROR WFLinkedListNode_GetData(WFLinkedListNode* node, void** pdata) {
|
|
||||||
if (node == NULL) return WFERROR_NULLPTR;
|
|
||||||
|
|
||||||
*pdata = node->mRawData;
|
|
||||||
return WFERROR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
#pragma endregion
|
|
||||||
@@ -1,136 +0,0 @@
|
|||||||
#if !defined(_YYCDLL_WFASSOC_UTILS_H__IMPORTED_)
|
|
||||||
#define _YYCDLL_WFASSOC_UTILS_H__IMPORTED_
|
|
||||||
|
|
||||||
#include <Windows.h>
|
|
||||||
#include <inttypes.h>
|
|
||||||
|
|
||||||
// useful macro
|
|
||||||
|
|
||||||
#define WFNEW(type) ((type*)malloc(sizeof(type)))
|
|
||||||
#define WFNEW_ARRAY(type) ((type*)malloc(sizeof(type)*count);)
|
|
||||||
#define WFVERSION 0
|
|
||||||
#define WFSUCCESS(expr) (!expr)
|
|
||||||
#define WFFAILED(expr) expr
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// wfassoc Error Enum
|
|
||||||
/// </summary>
|
|
||||||
typedef enum _WFERROR {
|
|
||||||
/// <summary>
|
|
||||||
/// All operation done successfully
|
|
||||||
/// </summary>
|
|
||||||
WFERROR_OK = 0,
|
|
||||||
/// <summary>
|
|
||||||
/// The filed `WFVersion` in Profile Struct is not matched. It usually mean that currently used DLL is not matched with the DLL when compiling this application.
|
|
||||||
/// </summary>
|
|
||||||
WFERROR_INVALID_VERSION = 1,
|
|
||||||
/// <summary>
|
|
||||||
/// The buffer in some operations is insufficient, please try expanding buffer.
|
|
||||||
/// </summary>
|
|
||||||
WFERROR_INSUFFICIENT_BUFFER = 2,
|
|
||||||
/// <summary>
|
|
||||||
/// Some essential pointer variable is NULL.
|
|
||||||
/// </summary>
|
|
||||||
WFERROR_NULLPTR = 3,
|
|
||||||
WFERROR_WIN32 = 5,
|
|
||||||
WFERROR_ALLOC = 6,
|
|
||||||
WFERROR_END_OF_TAIL = 7,
|
|
||||||
WFERROR_CRT = 8,
|
|
||||||
WFERROR_INVALID_ARGUMENTS = 9
|
|
||||||
}WFERROR;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// wfassoc Profile Struct
|
|
||||||
/// </summary>
|
|
||||||
typedef struct _WFAPP_PROFILE {
|
|
||||||
/// <summary>
|
|
||||||
/// wfassoc version. Fill it with `WFVERSION` in your application. This field is used for version checking.
|
|
||||||
/// </summary>
|
|
||||||
uint32_t WFVersion;
|
|
||||||
/// <summary>
|
|
||||||
/// The path to locate your application.
|
|
||||||
/// </summary>
|
|
||||||
wchar_t* AppPath;
|
|
||||||
/// <summary>
|
|
||||||
/// The command will be executed when opening files.
|
|
||||||
/// </summary>
|
|
||||||
wchar_t* AppCommand;
|
|
||||||
/// <summary>
|
|
||||||
/// Your application's ProgID.
|
|
||||||
/// For more detail about how to create your ProgID, please browse: https://docs.microsoft.com/en-us/windows/win32/shell/fa-progids
|
|
||||||
/// We also provide a generator for creating legacy ProgID. Use `WFGenerateProgID` to create a legacy ProgID.
|
|
||||||
/// </summary>
|
|
||||||
wchar_t* ProgID_Vendor;
|
|
||||||
wchar_t* ProgID_Component;
|
|
||||||
uint32_t ProgID_Version;
|
|
||||||
/// <summary>
|
|
||||||
/// Your application supported file extensions.
|
|
||||||
/// The structure of this field is connecting all supported extensions with dot(.) end to end. For example:
|
|
||||||
/// `.jpg\0.png\0.gif\0`
|
|
||||||
/// </summary>
|
|
||||||
wchar_t* SupportedTypes;
|
|
||||||
BOOL RegisterForAllUsers;
|
|
||||||
BOOL SetAsDefault;
|
|
||||||
BOOL ShowInOpenWithMenu;
|
|
||||||
BOOL UseOpenWithList;
|
|
||||||
}WFAPP_PROFILE;
|
|
||||||
|
|
||||||
typedef struct _WFAPP_INTERNAL_PROFILE {
|
|
||||||
WFString* AppPath;
|
|
||||||
WFString* AppBasePath;
|
|
||||||
WFString* AppFileName;
|
|
||||||
|
|
||||||
WFString* ProgID;
|
|
||||||
|
|
||||||
WFString* AppCommand;
|
|
||||||
|
|
||||||
WFLinkedList* SupportedTypes;
|
|
||||||
|
|
||||||
BOOL RegisterForAllUsers;
|
|
||||||
BOOL SetAsDefault;
|
|
||||||
BOOL ShowInOpenWithMenu;
|
|
||||||
BOOL UseOpenWithList;
|
|
||||||
}WFAPP_INTERNAL_PROFILE;
|
|
||||||
|
|
||||||
typedef struct _WFString {
|
|
||||||
wchar_t* mRawData;
|
|
||||||
uint32_t mLength;
|
|
||||||
uint32_t mCapacity;
|
|
||||||
|
|
||||||
uint32_t mRealLength;
|
|
||||||
uint32_t mRealCapacity;
|
|
||||||
}WFString;
|
|
||||||
|
|
||||||
WFERROR WFString_Alloc_Wchar(WFString** strl, const wchar_t* raw_data);
|
|
||||||
WFERROR WFString_Alloc_Char(WFString** strl, const char* raw_data, BOOL is_utf8);
|
|
||||||
WFERROR WFString_Alloc_Capacity(WFString** strl, uint32_t size);
|
|
||||||
WFERROR WFString_Alloc(WFString** strl);
|
|
||||||
WFERROR WFString_Free(WFString* strl);
|
|
||||||
WFERROR WFString_Resize(WFString* strl, uint32_t new_size);
|
|
||||||
WFERROR WFString_GetData(WFString* strl, wchar_t** pdata);
|
|
||||||
WFERROR WFString_SetData(WFString* strl, const wchar_t* data);
|
|
||||||
WFERROR WFString_GetLength(WFString* strl, uint32_t* len);
|
|
||||||
WFERROR WFString_Printf(WFString* strl, const wchar_t* format, ...);
|
|
||||||
WFERROR WFString_Concat_Wchar(WFString* strl, const wchar_t* extra);
|
|
||||||
WFERROR WFString_Concat_String(WFString* strl, WFString* extra);
|
|
||||||
WFERROR WFString_SubString(WFString* strl, WFString* substring, uint32_t start_index, uint32_t length);
|
|
||||||
|
|
||||||
typedef WFERROR(*WFLinkedListNode_FreeDataFunc)(void* data);
|
|
||||||
typedef struct _WFLinkedListNode {
|
|
||||||
void* mRawData;
|
|
||||||
WFLinkedListNode* mNext;
|
|
||||||
}WFLinkedListNode;
|
|
||||||
typedef struct _WFLinkedList {
|
|
||||||
WFLinkedListNode* mHead;
|
|
||||||
WFLinkedListNode* mTail;
|
|
||||||
uint32_t mLength;
|
|
||||||
}WFLinkedList;
|
|
||||||
|
|
||||||
WFERROR WFLinkedList_Alloc(WFLinkedList** list);
|
|
||||||
WFERROR WFLinkedList_Free(WFLinkedList* list);
|
|
||||||
WFERROR WFLinkedList_Free_Full(WFLinkedList* list, WFLinkedListNode_FreeDataFunc free_func);
|
|
||||||
WFERROR WFLinkedList_Add(WFLinkedList* list, void* data);
|
|
||||||
WFERROR WFLinkedList_NodeIterator(WFLinkedList* list, WFLinkedListNode** node_ptr);
|
|
||||||
WFERROR WFLinkedListNode_GetData(WFLinkedListNode* node, void** pdata);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,81 +0,0 @@
|
|||||||
#include "../wfassoc/wfassoc.h"
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <tchar.h>
|
|
||||||
|
|
||||||
#define COMMAND_MAX_LENGTH 128
|
|
||||||
|
|
||||||
WFAPP_PROFILE* create_profile();
|
|
||||||
TCHAR* create_progId();
|
|
||||||
void free_profile(WFAPP_PROFILE* profile);
|
|
||||||
|
|
||||||
int main(int argc, char* args[]) {
|
|
||||||
|
|
||||||
// alloc application profile
|
|
||||||
WFAPP_PROFILE* profile = create_profile();
|
|
||||||
if (profile == NULL) {
|
|
||||||
puts("Error: Fail to allocating profile structure.\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// alloc input string and check it
|
|
||||||
char* input_str = malloc(sizeof(char) * (COMMAND_MAX_LENGTH + 1));
|
|
||||||
if (input_str == NULL) return;
|
|
||||||
|
|
||||||
// accept input
|
|
||||||
while (TRUE) {
|
|
||||||
gets_s(input_str, COMMAND_MAX_LENGTH);
|
|
||||||
if (!strcmp(input_str, "install")) {
|
|
||||||
_tprintf(TEXT("%s\n"), profile->ProgID);
|
|
||||||
} else if (!strcmp(input_str, "uninstall")) {
|
|
||||||
_tprintf(TEXT("%s\n"), profile->ProgID);
|
|
||||||
} else if (!strcmp(input_str, "quit")) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//free input string
|
|
||||||
free(input_str);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
WFAPP_PROFILE* create_profile() {
|
|
||||||
WFAPP_PROFILE* profile = (WFAPP_PROFILE*)malloc(sizeof(WFAPP_PROFILE));
|
|
||||||
if (profile == NULL) return NULL;
|
|
||||||
memset(profile, 0, sizeof(WFAPP_PROFILE));
|
|
||||||
|
|
||||||
profile->WFVersion = WFVERSION;
|
|
||||||
profile->AppPath = TEXT("E:\\pineapple-picture\\ppic.exe");
|
|
||||||
profile->AppCommand = TEXT("E:\\pineapple-picture\\ppic.exe \"%1\"");
|
|
||||||
profile->SupportedTypes = TEXT(".png\0.jpg\0");
|
|
||||||
profile->ProgID = create_progId();
|
|
||||||
if (profile->ProgID == NULL) {
|
|
||||||
free_profile(profile);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return profile;
|
|
||||||
}
|
|
||||||
|
|
||||||
TCHAR* create_progId() {
|
|
||||||
TCHAR* progid = NULL;
|
|
||||||
int progIdSize;
|
|
||||||
if (WFFAILED(WFGenerateProgID(TEXT("PineapplePicture"), TEXT("Image"), 0, NULL, &progIdSize))) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
progid = (TCHAR*)malloc(sizeof(TCHAR) * progIdSize);
|
|
||||||
if (progid == NULL) return NULL;
|
|
||||||
memset(progid, 0, sizeof(TCHAR) * progIdSize);
|
|
||||||
|
|
||||||
if (WFFAILED(WFGenerateProgID(TEXT("PineapplePicture"), TEXT("Image"), 0, progid, &progIdSize))) {
|
|
||||||
free(progid);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return progid;
|
|
||||||
}
|
|
||||||
|
|
||||||
void free_profile(WFAPP_PROFILE* profile) {
|
|
||||||
if (profile->ProgID != NULL) free(profile->ProgID);
|
|
||||||
free(profile);
|
|
||||||
}
|
|
||||||
@@ -1,214 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
|
||||||
<ProjectConfiguration Include="Debug_MB|Win32">
|
|
||||||
<Configuration>Debug_MB</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Debug_MB|x64">
|
|
||||||
<Configuration>Debug_MB</Configuration>
|
|
||||||
<Platform>x64</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Debug_UNICODE|Win32">
|
|
||||||
<Configuration>Debug_UNICODE</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Release_UNICODE|Win32">
|
|
||||||
<Configuration>Release_UNICODE</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Debug_UNICODE|x64">
|
|
||||||
<Configuration>Debug_UNICODE</Configuration>
|
|
||||||
<Platform>x64</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Release_UNICODE|x64">
|
|
||||||
<Configuration>Release_UNICODE</Configuration>
|
|
||||||
<Platform>x64</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
</ItemGroup>
|
|
||||||
<PropertyGroup Label="Globals">
|
|
||||||
<VCProjectVersion>16.0</VCProjectVersion>
|
|
||||||
<Keyword>Win32Proj</Keyword>
|
|
||||||
<ProjectGuid>{ad275ad7-cbd5-41ca-ab24-bb707b3f7534}</ProjectGuid>
|
|
||||||
<RootNamespace>wfassocexample</RootNamespace>
|
|
||||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug_UNICODE|Win32'" Label="Configuration">
|
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug_MB|Win32'" Label="Configuration">
|
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
|
||||||
<CharacterSet>MultiByte</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_UNICODE|Win32'" Label="Configuration">
|
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug_UNICODE|x64'" Label="Configuration">
|
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug_MB|x64'" Label="Configuration">
|
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_UNICODE|x64'" Label="Configuration">
|
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
|
||||||
<ImportGroup Label="ExtensionSettings">
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Label="Shared">
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug_UNICODE|Win32'">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug_MB|Win32'" Label="PropertySheets">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release_UNICODE|Win32'">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug_UNICODE|x64'">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug_MB|x64'" Label="PropertySheets">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release_UNICODE|x64'">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<PropertyGroup Label="UserMacros" />
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug_UNICODE|Win32'">
|
|
||||||
<LinkIncremental>true</LinkIncremental>
|
|
||||||
<OutDir>$(SolutionDir)builds\Debug\</OutDir>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug_MB|Win32'">
|
|
||||||
<LinkIncremental>true</LinkIncremental>
|
|
||||||
<OutDir>$(SolutionDir)builds\Debug\</OutDir>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_UNICODE|Win32'">
|
|
||||||
<LinkIncremental>false</LinkIncremental>
|
|
||||||
<OutDir>$(SolutionDir)builds\Release\</OutDir>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug_UNICODE|x64'">
|
|
||||||
<LinkIncremental>true</LinkIncremental>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug_MB|x64'">
|
|
||||||
<LinkIncremental>true</LinkIncremental>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release_UNICODE|x64'">
|
|
||||||
<LinkIncremental>false</LinkIncremental>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug_UNICODE|Win32'">
|
|
||||||
<ClCompile>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<SDLCheck>true</SDLCheck>
|
|
||||||
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<ConformanceMode>true</ConformanceMode>
|
|
||||||
<CompileAs>CompileAsC</CompileAs>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<SubSystem>Console</SubSystem>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug_MB|Win32'">
|
|
||||||
<ClCompile>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<SDLCheck>true</SDLCheck>
|
|
||||||
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<ConformanceMode>true</ConformanceMode>
|
|
||||||
<CompileAs>CompileAsC</CompileAs>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<SubSystem>Console</SubSystem>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release_UNICODE|Win32'">
|
|
||||||
<ClCompile>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
|
||||||
<SDLCheck>true</SDLCheck>
|
|
||||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<ConformanceMode>true</ConformanceMode>
|
|
||||||
<CompileAs>CompileAsC</CompileAs>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<SubSystem>Console</SubSystem>
|
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug_UNICODE|x64'">
|
|
||||||
<ClCompile>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<SDLCheck>true</SDLCheck>
|
|
||||||
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<ConformanceMode>true</ConformanceMode>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<SubSystem>Console</SubSystem>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug_MB|x64'">
|
|
||||||
<ClCompile>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<SDLCheck>true</SDLCheck>
|
|
||||||
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<ConformanceMode>true</ConformanceMode>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<SubSystem>Console</SubSystem>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release_UNICODE|x64'">
|
|
||||||
<ClCompile>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
|
||||||
<SDLCheck>true</SDLCheck>
|
|
||||||
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<ConformanceMode>true</ConformanceMode>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<SubSystem>Console</SubSystem>
|
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\wfassoc\wfassoc.vcxproj">
|
|
||||||
<Project>{4aac8f0c-3e1c-4584-b682-05bbf96a813f}</Project>
|
|
||||||
</ProjectReference>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="main.c" />
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
|
||||||
<ImportGroup Label="ExtensionTargets">
|
|
||||||
</ImportGroup>
|
|
||||||
</Project>
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup>
|
|
||||||
<Filter Include="源文件">
|
|
||||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
|
||||||
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="头文件">
|
|
||||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
|
||||||
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="资源文件">
|
|
||||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
|
||||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
|
||||||
</Filter>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="main.c">
|
|
||||||
<Filter>源文件</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
||||||
Reference in New Issue
Block a user