From 2823d1a7ef656b0e25eabaf1d133ff170d638e57 Mon Sep 17 00:00:00 2001 From: Bennert de Wijs Date: Thu, 12 Feb 2026 16:35:20 +0100 Subject: [PATCH 1/7] Replace DVT icon with DVTk icon --- .../Source/QR SCU Emulator.resx | 594 ++++++++++++++++-- 1 file changed, 541 insertions(+), 53 deletions(-) diff --git a/Query_Retrieve_SCU_Emulator/Source/QR SCU Emulator.resx b/Query_Retrieve_SCU_Emulator/Source/QR SCU Emulator.resx index d3561c1..8e90ebf 100644 --- a/Query_Retrieve_SCU_Emulator/Source/QR SCU Emulator.resx +++ b/Query_Retrieve_SCU_Emulator/Source/QR SCU Emulator.resx @@ -1,17 +1,17 @@ - + - @@ -117,48 +117,536 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + 17, 17 - + 126, 17 - + 225, 17 - + 674, 17 - + 335, 17 - + 487, 17 - - 32 + + 57 - + - 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 + TkSuQmCCKAAAADAAAABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAP7+/v///////v7+//// + ///+/v7////////////+/v7////////////+/v7////////////+/v7///////7+/v/+/v7//v7+//7+ + /v/+/v7//v7+///////+/v7////////////+/v7////////////+/v7////////////+/v7///////// + ///+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7////////////+/v7////////////+/v7///////7+ + /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+/9bW + 1v/Hx8f/x8fH/8fHx//Pz8///v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ + /v/+/v7//v7+//7+/v/j4tT/0c64/9HOuP/Rzrj/0c64/9/ez//+/v7//v7+//7+/v/+/v7//v7+//7+ + /v/+/v7//v7+//////////////////////////////////////////////////////////////////7+ + /v/k5OT/4eHh/7i3t/+oqKj/r6+v/7u7u//FxcX//v7+//////////////////////////////////// + ////////////////////////8fDp/9vayP+4tJH/t7SQ/7e0kP+8uJf/y8iv//j49f////////////// + //////////////////////////////7+/v///////v7+///////+/v7////////////+/v7///////// + ///+/v7///////r6+v9TUlL/RURE/0VERP9EQ0P/b25u/7u7u//FxcX//v7+///////+/v7///////// + ///+/v7////////////+/v7////////////v7ub/c24o/2ReD/9kXQ//ZF4P/2VfEP+ppnv/7ezk//// + ///+/v7////////////+/v7////////////+/v7///////7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ + /v/+/v7//v7+//7+/v/+/v7//v7+//r6+v9TUlL/REND/0VERP9EQ0P/b25u/7q6uv/FxcX//v7+//7+ + /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//z7+v+OilH/ZF4O/2ReD/9jXg//ZF4O/4+K + Uv/e3c3//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//////////////////// + //////////////////////////////////////////////r6+v9TUlL/RURE/0VERP9FRET/b25u/7u7 + u//FxcX//v7+/////////////////////////////////////////////////7Owif9kXg//Y14P/2Ne + D/9kXg7/dnEs/87Ls//8/Pv///////////////////////////////////////////////////////7+ + /v///////v7+///////+/v7////////////+/v7////////////+/v7///////r6+v9TUlL/RURE/0VE + RP9EQ0P/b25u/7u7u//FxcX//v7+///////+/v7////////////+/v7////////////+/v7/19XB/2Zg + Ev9kXQ//ZF4P/2ReD/9pYxf/ubaT//X18P/+/v7////////////+/v7////////////+/v7///////// + ///+/v7///////7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//r6 + +v9TUlL/REND/0VERP9EQ0P/b25u/7q6uv/FxcX//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ + /v/v7+f/dG8p/2ReD/9jXg//ZF4O/2ReD/+gnGz/6Ofc//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ + /v/+/v7//v7+//7+/v/+/v7//v7+//////////////////////////////////////////////////// + //////////////r6+v9TUlL/RURE/0VERP9FRET/b25u/7u7u//FxcX//v7+//////////////////// + //////////////z8+/+Pi1L/Y10O/2NeD/9kXg7/Y14P/4WAQ//Y1sT//v7+//////////////////// + //////////////////////////////////////////////7+/v///////v7+///////+/v7///////// + ///+/v7////////////+/v7///////r6+v9TUlL/RURE/0VERP9EQ0P/b25u/7u7u//FxcX//v7+//// + ///+/v7////////////+/v7//v7+/7Owif9jXQ7/ZF4P/2ReD/9kXQ//cGsi/8fFqf/6+vj///////// + ///+/v7////////////+/v7////////////+/v7////////////+/v7///////7+/v/+/v7//v7+//7+ + /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//r6+v9TUlL/REND/0VERP9EQ0P/b25u/7q6 + uv/FxcX//v7+//7+/v/+/v7//v7+//7+/v/+/v7/19bC/2ZgE/9jXg//ZF4O/2ReD/9mYBL/sKyF//Hw + 6v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//// + //////////////////////////////////////////////////////////////r6+v9TUlL/RURE/0VE + RP9FRET/b25u/7u7u//FxcX//v7+///////////////////////w8Oj/dXAp/2NeD/9kXg7/Y14P/2Re + D/+Wkl3/4uHT//7+/v////////////////////////////////////////////////////////////// + //////////////7+/v///////v7+///////+/v7////////////+/v7////////////+/v7///////r6 + +v9TUlL/RURE/0VERP9EQ0P/b25u/7u7u//FxcX//v7+///////+/v7///////z8+v+Pi1P/ZF4P/2Re + D/9kXQ//ZF4P/314Nv/FwqX/7+/n///////+/v7////////////+/v7////////////+/v7///////// + ///+/v7////////////+/v7///////7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ + /v/+/v7//v7+//r6+v9TUlL/REND/0VERP9EQ0P/b25u/7q6uv/FxcX//v7+//7+/v/+/v7//v7+/7i1 + kv9kXg//ZF4O/2ReD/9jXg//aWMX/7u4lv/Gw6f/zcqx//r6+P/+/v7//v7+//7+/v/+/v7//v7+//7+ + /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//////////////////////////////////// + //////////////////////////////r6+v9TUlL/RURE/0VERP9FRET/b25u/7u7u//FxcX//v7+//// + /////////////9TTvf9mYBL/Y14P/2NeD/9kXg7/ZF4Q/6unff/HxKj/x8So/9jWw//+/v7///////// + //////////////////////////////////////////////////////////////7+/v///////v7+//// + ///+/v7////////////+/v7////////////+/v7///////r6+v9TUlL/RURE/0VERP9EQ0P/b25u/7u7 + u//FxcX//v7+///////+/v7///////7+/v+tqoH/ZF4P/2ReD/9kXQ//ZF4P/21nHv+8uZj/x8So/8fE + qP/m5dn//v7+///////+/v7////////////+/v7////////////+/v7////////////+/v7///////7+ + /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//r6+v9TUlL/REND/0VE + RP9EQ0P/b25u/7q6uv/FxcX//v7+//7+/v/+/v7//v7+//7+/v/6+vj/h4JF/2ReD/9jXg//ZF4O/2Re + D/+Aejr/xcKl/8bDp//Jxqv/8/Pt//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ + /v/+/v7//v7+//////////////////////////////////////////////////////////////////r6 + +v9TUlL/RURE/0VERP9FRET/b25u/7u7u//FxcX//v7+////////////////////////////6eje/21n + Hf9kXg7/Y14P/2NeD/9kXg//mZVh/8fEqP/HxKj/z822//z8+/////////////////////////////// + //////////////////////////////7+/v///////v7+///////+/v7////////////+/v7///////Pz + 8//c3Nz/3Nzc/9nZ2f9RUFD/RURE/0VERP9EQ0P/b25u/7u7u//AwMD/3d3d/93d3f/d3d3/3d3d//Dw + 8P/+/v7//////8jGqv9kXhD/ZF4P/2ReD/9kXQ//ZmAS/7Gth//Hw6j/x8So/9zayf/+/v7///////// + ///+/v7////////////+/v7////////////+/v7///////7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ + /v/+/v7//v7+/+np6f+6urr/urq6/7i4uP9OTU3/REND/0VERP9EQ0P/b25u/7q6uv+6urr/urq6/7q6 + uv+6urr/urq6/+Hh4f/+/v7//v7+//7+/f+fm2v/Y10O/2ReD/9jXg//ZF4O/3JsJf/AvZ3/xsOn/8fE + qP/r6uD//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//////////////////// + //////////////////+qqqr/YF9f/15dXf9XVlb/WFdX/1hXV/9GRUX/RURE/0VERP9FRET/TEtL/1lY + WP9ZWFj/WVhY/1lYWP+mpaX/u7u7/+Hh4f/////////////////29fH/fHc1/2NeD/9kXg7/Y14P/2Ne + D/+HgkX/xsOn/8fEqP/Kx63/9/by//////////////////////////////////////////////////7+ + /v///////v7+///////+/v7///////////+cm5v/RURE/0VERP9EQ0P/RURE/0VERP9EQ0P/RURE/0VE + RP9EQ0P/RURE/0VERP9EQ0P/RURE/0VERP+hoaH/u7u7/+Hh4f/+/v7////////////+/v7/4N/P/2hi + Fv9kXQ//ZF4P/2ReD/9kXg//oJxt/8fEqP/Hw6j/0tC6//39/P/+/v7////////////+/v7///////// + ///+/v7///////7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v+cm5v/REND/0RDQ/9EQ0P/REND/0VE + RP9EQ0P/REND/0VERP9EQ0P/REND/0VERP9EQ0P/REND/0VERP+hoaH/u7u7/+Li4v/+/v7//v7+//7+ + /v/+/v7//v7+/7q3lP9kXg//ZF4O/2ReD/9jXg//aGIW/7ezj//HxKj/x8So/+Df0P/+/v7//v7+//7+ + /v/+/v7//v7+//7+/v/+/v7//v7+//////////////////////////////////////+cm5v/RURE/0VE + RP9FRET/RURE/0VERP9FRET/RURE/0VERP9FRET/RURE/0VERP9FRET/RURE/0VERP/S0tL/+Pj4//z8 + /P////////////////////////////z8+/+RjVX/Y14P/2NeD/9kXg7/Y14P/4B7Ov/08+7/+fn2//r6 + 9//+/v7//////////////////////////////////////////////////v7+///////+/v7///////// + //+0tLT/c3Jy/3Jycv9jYmL/YmFh/2JhYf9iYWH/YmFh/2JhYf9iYWH/YmFh/2JhYf9iYWH/ZGRk/3Jx + cf/h4eH////////////+/v7////////////+/v7////////////w8Oj/j4tS/4qGS/+Khkv/fXk+/4qG + S//Hxan////////////+/v7////////////+/v7////////////+/v7///////7+/v/+/v7//v7+//7+ + /v/+/v7//v7+//7+/v/39/f/2dnZ/9fX1/+mpqb/o6Ki/6Oiov+joqL/o6Ki/6Ojo/+pqan/uLi4/7q6 + uv+6urr/u7u7/8rKyv/09PT//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//r6 + +v/z8/P/vLy8/+7u7v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//// + ///////////////////////////////////b29v/REND/0RDQ/9EQ0P/REND/0RDQ/9EQ0P/REND/0RD + Q/9FRET/UE9P/3t6ev+xsbH/u7u7/7u7u//BwcH/8/Pz//////////////////////////////////// + ////////8fHx/4iIiP/S0tL/u7u7/8zMzP/+/v7///////////////////////////////////////// + /////////////////////////v7+///////+/v7////////////b29v/RURE/0VERP9EQ0P/RURE/0VE + RP9EQ0P/RURE/0VERP9EQ0P/RURE/0VERP9PTk7/nZ2d/7u7u/+6urr/xcXF//z8/P/+/v7///////// + ///+/v7////////////+/v7/nJyc/0ZFRf+ioaH/u7u7/7u7u//t7e3////////////+/v7///////// + ///+/v7////////////+/v7///////7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/b29v/REND/0RD + Q/9EQ0P/REND/0RDQ/9EQ0P/REND/0RDQ/9EQ0P/REND/0RDQ/9EQ0P/SklJ/6Kiov+6urr/urq6/+Dg + 4P/+/v7//v7+//7+/v/+/v7//v7+//7+/v/t7Oz/T05O/0RDQ/9oZ2f/urq6/7q6uv/MzMz//v7+//7+ + /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//////////////////////////////////// + ///b29v/RURE/0VERP9FRET/SEdH/1tbW/9cW1v/aGdn/2RkZP9JSEj/RURE/0VERP9FRET/RURE/1hX + V/+3t7f/u7u7/8XFxf/+/v7///////////////////////7+/v+ZmJj/RURE/0VERP9GRUX/oaGh/7u7 + u/+7u7v/7e3t/////////////////////////////////////////////////////////////v7+//// + ///+/v7////////////b29v/RURE/0VERP9EQ0P/VlVV/7u7u/+7u7v/+fn5//7+/v/s7Oz/gH9//0VE + RP9EQ0P/RURE/0VERP+NjIz/u7u7/7u7u//z8/P////////////+/v7//////+rq6v9NTEz/RURE/0VE + RP9EQ0P/Z2Zm/7q6uv+6urr/y8vL//7+/v/+/v7////////////+/v7////////////+/v7///////7+ + /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/b29v/REND/0RDQ/9EQ0P/VlVV/7q6uv+7u7v/+fn5//7+ + /v/+/v7/+/v7/29vb/9EQ0P/REND/0RDQ/9hYWH/urq6/7q6uv/m5ub//v7+//7+/v/+/v7//v7+/5ST + k/9EQ0P/REND/0RDQ/9EQ0P/RURE/6Ghof+6urr/u7u7/+3t7f/+/v7//v7+//7+/v/+/v7//v7+//7+ + /v/+/v7//v7+///////////////////////////////////////b29v/RURE/0VERP9FRET/VlVV/7u7 + u/+7u7v/+fn5/////////////////83MzP9FRET/RURE/0VERP9JSEj/tLS0/7u7u//e3t7///////// + ////////6enp/0pJSf9FRET/RURE/0VERP9FRET/RURE/2dmZv+6urr/u7u7/8vLy//+/v7///////// + /////////////////////////////////////////v7+///////+/v7////////////b29v/RURE/0VE + RP9EQ0P/VlVV/7u7u/+7u7v/+fn5///////+/v7///////j4+P9RUFD/RURE/0VERP9EQ0P/pKSk/7u7 + u//a2tr////////////+/v7/j46O/0VERP9EQ0P/RURE/0VERP9EQ0P/RURE/0ZFRf+gn5//u7u7/7u7 + u//s7Oz////////////+/v7////////////+/v7///////7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ + /v/b29v/REND/0RDQ/9EQ0P/VlVV/7q6uv+7u7v/+fn5//7+/v/+/v7//v7+//7+/v9mZWX/REND/0RD + Q/9EQ0P/mZiY/7q6uv/b29v//v7+//7+/v/k5OT/SklJ/0RDQ/9EQ0P/REND/0dGRv9EQ0P/REND/0RD + Q/9mZWX/urq6/7q6uv/MzMz//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//////////////////// + ///////////////////b29v/RURE/0VERP9FRET/VlVV/7u7u/+7u7v/+fn5//////////////////// + //9vbm7/RURE/0VERP9FRET/lJSU/7u7u//f39////////7+/v+Lior/RURE/0VERP9FRET/SEdH/4yM + jP9FRET/RURE/0VERP9FRUX/n5+f/7u7u/+7u7v/7+/v//////////////////////////////////7+ + /v///////v7+///////+/v7////////////b29v/RURE/0VERP9EQ0P/VlVV/7u7u/+7u7v/+fn5//// + ///+/v7///////7+/v9nZ2f/RURE/0VERP9EQ0P/l5eX/7u7u//o6Oj//////+Hg4P9JSEj/RURE/0VE + RP9EQ0P/dnZ2/76+vv9iYWH/RURE/0VERP9EQ0P/ampq/7q6uv+6urr/zc3N//7+/v/+/v7///////// + ///+/v7///////7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/b29v/REND/0RERP9EQ0P/VlVV/7u7 + u/+7u7v/+fn5//7+/v/+/v7//v7+//n4+P9SUVH/REND/0RDQ/9EQ0P/oqGh/7u7u//29vb//v7+/4aF + hf9EQ0P/REND/0RDQ/9JSEj/rKys/97e3v+wsLD/REND/0RDQ/9EQ0P/RkVF/6WkpP+6urr/u7u7/+7u + 7v/+/v7//v7+//7+/v/+/v7//v7+///////////////////////////////////////b29v/RURE/0VE + RP9FRET/VlVV/7u7u/+7u7v/+fn5/////////////////8/Pz/9FRET/RURE/0VERP9HRkb/sbGx/8jI + yP/+/v7/397e/0dGRv9FRET/RURE/0VERP90dHT/v7+///v7+//z8/P/UlFR/0VERP9FRET/RURE/2pp + af+6urr/u7u7/8zMzP/+/v7///////////////////////7+/v///////v7+///////+/v7///////// + ///b29v/RURE/0VERP9EQ0P/VlVV/7u7u/+7u7v/4eHh/+Tk5P/k5OT/4eHh/29ubv9EQ0P/RURE/0VE + RP9cW1v/urq6/+fn5//+/v7/gYGB/0VERP9EQ0P/RURE/0lISP+rq6v/3d3d///////+/v7/l5eX/0VE + RP9EQ0P/RURE/0ZFRf+ioqL/u7u7/7u7u//t7e3////////////+/v7///////7+/v/+/v7//v7+//7+ + /v/+/v7//v7+//7+/v/b29v/REND/0RERP9EQ0P/VlVV/7u7u/+6urr/u7u7/7q6uv+wsLD/bWxs/0RD + Q/9EQ0P/REND/0RDQ/+GhYX/zc3N//7+/v/Z2dn/R0ZG/0RDQ/9EQ0P/REND/3Nzc//AwMD/+fn5//7+ + /v/+/v7/5eTk/0dGRv9EQ0P/REND/0RDQ/9oaGj/urq6/7u7u//MzMz//v7+//7+/v/+/v7//v7+//// + ///////////////////////////////////b29v/RURE/0VERP9FRET/SUhI/2RkZP9kZGT/ZGRk/2Bf + X/9KSUn/REND/0VERP9FRET/RURE/1FQUP/BwcH/+fn5//7+/v9+fX3/RURE/0VERP9FRET/R0ZG/6ur + q//c3Nz//v7+/////////////v7+/318fP9FRET/RURE/0VERP9GRUX/oqKi/7u7u/+7u7v/7u7u//// + /////////////////////////v7+///////+/v7////////////b29v/RURE/0VERP9EQ0P/RURE/0VE + RP9EQ0P/RURE/0VERP9EQ0P/RURE/0VERP9EQ0P/SEdH/7i3t//7+/v//////9XV1f9GRUX/RURE/0VE + RP9ERET/cnFx/7+/v//5+fn////////////+/v7//////87Ozv9FRET/RURE/0VERP9ERET/aGho/7q6 + uv+6urr/zs7O//7+/v/+/v7///////7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/b29v/REND/0RD + Q/9ERET/REND/0RERP9EQ0P/RERE/0RERP9EQ0P/RERE/0RERP9PTk7/wMDA//7+/v/+/v7//v7+/3h4 + eP9EQ0P/REND/0RDQ/9JSEj/vby8/+Li4v/+/v7//v7+//7+/v/+/v7//v7+//z8/P9mZmb/REND/0RD + Q/9EQ0P/RURE/7Gxsf/Pz8//z8/P//39/f/+/v7//v7+//////////////////////////////////// + ///b29v/RURE/0VERP9FRET/RURE/0VERP9FRET/RURE/0VERP9FRET/TEtL/4qJif/l5eX//v7+//// + ////////09LS/0VERP9FRET/RURE/0VERP+KiYn//v7+//////////////////////////////////// + //+0tLT/RURE/0VERP9FRET/RURE/4WEhP////////////////////////////////////////////// + ///+/v7////////////y8vL/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/729vf/R0dH/9vb2//// + ///+/v7////////////+/v7/19fX/7u7u/+7u7v/u7u7/7u7u//r6+v////////////+/v7///////// + ///+/v7////////////39/f/vLy8/7u7u/+7u7v/u7u7/8fHx//+/v7////////////+/v7///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////7+/v///////v7+///////+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//// + /////////v7+/////////////v7+/////////////v7+/////////////v7+///////+/v7//v7+//// + ///+/v7//v7+///////+/v7//v7+///////+/v7//v7+///////+/v7//v7+///////+/v7//v7+//// + ///+/v7//v7+///////+/v7//v7+/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAgAAAAQAAAAAEA + IAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////////// + ////////8/Pz//Dw8P/w8PD/+/v7/////////////////////////////////////////////v7+//Pz + 7f/z8uz/8/Ls//j39P////////////////////////////////////////////////////////////// + ////////+fn5/+vr6/+5ubn/sbGx/7u7u//v7+////////////////////////////////////////j4 + 9f/d28r/vLmY/7y5mP/HxKn/9fTw//////////////////////////////////////////////////// + ///////////////////Ix8f/RURE/0VERP9hYGD/u7u7/+/v7/////////////////////////////// + ///8/Pr/h4NG/2ReD/9kXg//fnk4/+fl2v////////////////////////////////////////////// + /////////////////////////////8jHx/9FRET/RURE/2FgYP+7u7v/7+/v//////////////////// + /////////////6uofv9kXg//ZF4P/2xmHP/OzLT//v7+//////////////////////////////////// + ////////////////////////////////////////yMfH/0VERP9FRET/YWBg/7u7u//v7+////////// + ///////////////////R0Ln/ZF4Q/2ReD/9kXg//sKyF//r6+P////////////////////////////// + ///////////////////////////////////////////////////Ix8f/RURE/0VERP9hYGD/u7u7/+/v + 7///////////////////////7ezk/3BqIf9kXg//ZF4P/4+LU//x8On///////////////////////// + /////////////////////////////////////////////////////////////8jHx/9FRET/RURE/2Fg + YP+7u7v/7+/v//////////////////z8+v+Ig0f/ZF4P/2ReD/92cSz/393O//////////////////// + ////////////////////////////////////////////////////////////////////////yMfH/0VE + RP9FRET/YWBg/7u7u//v7+//////////////////rKl//2ReD/9kXg//aGIV/8TBpP/+/v3///////// + //////////////////////////////////////////////////////////////////////////////// + ///Ix8f/RURE/0VERP9hYGD/u7u7/+/v7////////////9LQuv9lXxD/ZF4P/2ReD/+gnGz/29rI//7+ + /v////////////////////////////////////////////////////////////////////////////// + /////////////8jHx/9FRET/RURE/2FgYP+7u7v/7+/v////////////pKBy/2ReD/9kXg//ZmAT/7q3 + lP/HxKj/6+rh//////////////////////////////////////////////////////////////////// + ////////////////////////yMfH/0VERP9FRET/YWBg/7u7u//v7+/////////////39/P/e3Yz/2Re + D/9kXg//enUx/8XCpf/Kx63/9/fz//////////////////////////////////////////////////// + ///////////////////////////////////Ix8f/RURE/0VERP9hYGD/u7u7/+/v7/////////////// + ///g38//aGIV/2ReD/9kXg//k49Y/8fEqP/T0Lr//f39//////////////////////////////////// + ///////////////////////////////////l5eX/0dHR/6enp/9FRET/RURE/2FgYP+7u7v/zMzM/9LS + 0v/S0tL/8vLy//////+6t5T/ZF4P/2ReD/9kXhD/ramA/8fEqP/h39D///////////////////////// + ///////////////////////////////////8/Pz/lZSU/4WFhf94eHj/aWlp/0VERP9FRET/UVBQ/3l5 + ef95eXn/hoWF/7u7u//r6+v///////7+/f+QjFT/ZF4P/2ReD/9uaB7/vrub/8fEqP/v7+f///////// + //////////////////////////////////////////////v7+/9FRET/RURE/0VERP9FRET/RURE/0VE + RP9FRET/RURE/0VERP9bWlr/u7u7/+vr6/////////////Hw6v9ybSb/ZF4P/2ReD/+BfDz/xsOn/8zJ + sP/6+ff/////////////////////////////////////////////////+/v7/0VERP9FRET/RURE/0VE + RP9FRET/RURE/0VERP9FRET/RURE/2NiYv/k5OT/9/f3/////////////////9TTvf9lXxD/ZF4P/2Nd + D/+ppnv/6Ofc//Pz7f/////////////////////////////////////////////////9/f3/oqGh/5eW + lv9/f3//f39//39/f/9/f3//f39//39/f/+BgID/q6qq/////////////////////////////////8fF + qP+xrof/nJly/7Owi//7+/r///////////////////////////////////////////////////////// + //+IiIj/ZWRk/1xbW/9cW1v/XFtb/11cXP9tbW3/mpqa/7q6uv++vr7/7e3t//////////////////// + ////////+fj4/8PDw/++vr7/4uLi//////////////////////////////////////////////////// + /////////////2tqav9FRET/RURE/0VERP9FRET/RURE/0VERP9FRET/c3Jy/7m5uf+/v7//+fn5//// + //////////////////+tra3/VVRU/7i4uP/CwsL//f39//////////////////////////////////// + ////////////////////////a2pq/0VERP9GRUX/VFNT/1lYWP9VVFT/RURE/0VERP9FRET/g4OD/7u7 + u//c3Nz/////////////////9/f3/1ZVVf9FRET/jYyM/7u7u//i4uL///////////////////////// + //////////////////////////////////9ramr/RURE/1BPT/+7u7v/5eXl//7+/v+9vb3/SEdH/0VE + RP9LSkr/tbW1/8jIyP////////////////+pqKj/RURE/0VERP9UU1P/uLi4/8LCwv/8/Pz///////// + /////////////////////////////////////////////2tqav9FRET/UE9P/7u7u//l5eX///////// + //+RkJD/RURE/0VERP+Wlpb/vb29//7+/v//////9fX1/1NSUv9FRET/RURE/0VERP+MjIz/u7u7/+Li + 4v//////////////////////////////////////////////////////a2pq/0VERP9QT0//u7u7/+Xl + 5f///////////8rJyf9FRET/RURE/4KCgv+7u7v//f39//////+kpKT/RURE/0VERP9FRET/RURE/1NT + U/+4uLj/wsLC//z8/P////////////////////////////////////////////////9ramr/RURE/1BP + T/+7u7v/5eXl////////////3Nzc/0VERP9FRET/enp6/7y8vP/+/v7/8/Pz/1FQUP9FRET/RkVF/2Vl + Zf9FRET/RURE/4yLi/+7u7v/5OTk/////////////////////////////////////////////////2tq + av9FRET/UE9P/7u7u//l5eX////////////U1NT/RURE/0VERP99fX3/xMTE//7+/v+gn5//RURE/0VE + RP9vb2//urq6/0VERP9FRET/VlVV/7m5uf/Dw8P//f39//////////////////////////////////// + ////////a2pq/0VERP9QT0//u7u7/+Xl5f///////////6urq/9FRET/RURE/4yLi//X19f/8PDw/09O + Tv9FRET/RkVF/6qqqv/39/f/d3Z2/0VERP9FRET/jo6O/7u7u//j4+P///////////////////////// + //////////////////9ramr/RURE/1BPT/+7u7v/zMzM/9bW1v/Kysr/V1ZW/0VERP9FRET/qqqq//T0 + 9P+bm5v/RURE/0VERP9ubW3/19fX///////Hx8f/RURE/0VERP9VVFT/uLi4/8LCwv/9/f3///////// + /////////////////////////////2tqav9FRET/SkpK/4GBgf+BgYH/enl5/1BPT/9FRET/RURE/2Zl + Zf/j4+P/7u7u/01MTP9FRET/RkVF/6mpqf/39/f///////39/f9fXl7/RURE/0VERP+NjY3/u7u7/+Pj + 4///////////////////////////////////////a2pq/0VERP9FRET/RURE/0VERP9FRET/RURE/0VE + RP9XVlb/3t7e//////+Xlpb/RURE/0VERP9sbGz/1tbW/////////////////62trf9FRET/RURE/1VU + VP+5ubn/w8PD//7+/v////////////////////////////////9ramr/RURE/0VERP9FRET/RURE/0VE + RP9IR0f/goKC/+rq6v//////6+vr/0tKSv9FRET/RkVF/9jY2P/8/Pz/////////////////9PT0/05N + Tf9FRET/RURE/7S0tP/19fX//v7+/////////////////////////////////9vb2//S0dH/0tHR/9LR + 0f/S0dH/1dXV//Ly8v/////////////////t7e3/0tHR/9LR0f/Y2Nj///////////////////////// + ////////3d3d/9LR0f/S0dH/5ubm//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAGAAAADAA + AAABACAAAAAAAGAJAAAAAAAAAAAAAAAAAAAAAAAA//////7+/v////////////7+/v///////v7+//T0 + 9P/j4+P/5eXl//7+/v/+/v7//v7+///////+/v7//v7+//7+/v/s6+L/6Obb/+vq4f/+/v7//v7+//// + ///+/v7/////////////////////////////////zMvL/4iIiP+DgoL/wMDA//7+/v////////////// + ////////+/r4/6mlev+OiU//oJxs/+zr4v///////////////////////v7+//7+/v/+/v7//v7+//7+ + /v/+/v7/p6am/0RDQ/9aWVn/wMDA//7+/v/+/v7//v7+//7+/v/+/v7/qKV5/2NdDv9oYhb/zsyz//7+ + /v/+/v7//v7+//7+/v/+/v7///////7+/v////////////7+/v//////p6am/0VERP9aWVn/wMDA//7+ + /v/+/v7//v7+///////OzLT/ZF4P/2ReD/+qp3z//Pz7///////+/v7//v7+///////+/v7///////// + ////////////////////////p6am/0VERP9aWVn/wMDA//7+/v///////////+vq4P9uaR//ZF4P/4iD + R//08+7//////////////////////////////////v7+//7+/v/+/v7//v7+//7+/v/+/v7/p6am/0RD + Q/9aWVn/wMDA//7+/v/+/v7/+/v5/4WBQ/9jXQ7/cWsj/+Df0P/+/v7//v7+//7+/v/+/v7//v7+//7+ + /v/+/v7///////7+/v////////////7+/v//////p6am/0VERP9aWVn/wMDA//7+/v/+/v7/qqZ7/2Re + D/9lXxH/sa2G/+3s5P/+/v7//v7+///////+/v7//v7+///////+/v7///////////////////////// + ////////p6am/0VERP9aWVn/wMDA//7+/v//////ubeU/2ReD/9kXg//p6N2/8vIrv/4+PX///////// + /////////////////////////v7+//7+/v/+/v7//v7+//7+/v/+/v7/p6am/0RDQ/9aWVn/wMDA//7+ + /v/+/v7//f39/5CMVP9jXQ7/a2UZ/7u3lf/V0r3//v7+//7+/v/+/v7//v7+//7+/v/+/v7///////7+ + /v///////v7+//b29v/Ly8v/jIuL/0VERP9aWVn/vLy8/8zMzP/MzMz/9PT0//Hw6f9zbSb/Y10O/3t2 + M//FwqX/4+HU//7+/v/+/v7//v7+///////+/v7/////////////////0dDQ/1JRUf9OTU3/SklJ/0VE + RP9GRUX/T05O/09OTv+vr6//8PDw///////U0r3/ZV8Q/2ReD/+UkFr/x8Sp//Hw6v////////////// + /////////v7+//7+/v/+/v7/zc3N/0RDQ/9EQ0P/REND/0RDQ/9EQ0P/REND/0RDQ//Kycn/9/f3//7+ + /v/+/v7/q6d9/2NdDv9lXxD/vLmY/+fl2f/+/v7//v7+//7+/v/+/v7///////7+/v//////6urq/6al + pf+Dg4P/goKC/4KCgv+JiYn/jo6O/5eWlv/19fX//v7+///////+/v7/+/v5/8TCpf+urI7/z864//// + ///+/v7//v7+///////+/v7/////////////////7e3t/0RDQ/9EQ0P/REND/0RDQ/9IR0f/cG9v/7Oz + s//Nzc3//v7+/////////////////5eWlv+6urr/3d3d/////////////////////////////v7+//7+ + /v/+/v7/7e3t/0RDQ/9FRET/UE9P/1VUVP9GRUX/REND/2JhYf+6urr/6Ojo//7+/v/+/v7/4eDg/0dG + Rv+CgoL/v7+///r6+v/+/v7//v7+//7+/v/+/v7///////7+/v//////7e3t/0RERP9NTEz/u7u7//z8 + /P/Z2dn/T05O/0VERP+ZmJj/1NTU///////+/v7/hIOD/0VERP9NTEz/tLS0/9zc3P/+/v7//v7+//// + ///+/v7/////////////////7e3t/0VERP9NTEz/u7u7//z8/P//////lpaW/0VERP95eXn/y8vL//// + ///d3d3/RkVF/0VERP9FRET/gYGB/7+/v//6+vr//////////////////v7+//7+/v/+/v7/7e3t/0RD + Q/9NTEz/u7u7//z8/P/+/v7/tbS0/0RDQ/9ubW3/zMzM//7+/v9/f3//REND/1hXV/9FRET/TUxM/7S0 + tP/d3d3//v7+//7+/v/+/v7///////7+/v//////7e3t/0RERP9NTEz/u7u7//z8/P/+/v7/rKys/0VE + RP9xcHD/1dXV/9nZ2f9GRUX/RkVF/7Cvr/9nZmb/REND/4SDg/+/v7//+vr6///////+/v7//v7+//7+ + /v/+/v7/7e3t/0RERP9NTEz/u7u7/+/v7//w8PD/cnFx/0VERP+Eg4P/6+vr/3t6ev9ERET/a2pq/+Xl + 5f+3trb/RERE/05NTf+0tLT/3d3d///////+/v7/////////////////7e3t/0RDQ/9KSUn/j4+P/46O + jv9ramr/RUND/0hHR//Dw8P/1dTU/0VERP9FRET/rq6u//39/f/4+Pj/U1JS/0VDQ/+DgoL/v7+///r6 + +v////////////7+/v//////7e3t/0RERP9FRET/REND/0VERP9EQ0P/R0ZG/7Cvr//+/v7/dnV1/0VE + RP9vbm7/5ubm///////+/v7/nZ2d/0VERP9OTU3/vb29/+bm5v/+/v7//v7+//7+/v/+/v7/8vLy/4B/ + f/+Af3//gH9//4CAgP+WlZX/29vb//7+/v/q6ur/gH9//4B/f//c3Nz//v7+///////+/v7/6urq/4B/ + f/+Af3//0tLS///////+/v7///////////////////////7+/v////////////////////////////// + ////////////////////////////////////////////////////////////////////////AAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAoAAAAEAAAACAAAAABAAQAAAAAAIAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAA - AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////ALK2ZmpmZmZmuytmKqZm - ZmYRERKqomERFpmZKqqqYZkWmZqqovohmRaZqqohqqGZFpkqopEvoZkWmbIpkbqhmRaZu7mRsvGZFpm7 - mZGxEZkRmZmZG7GZmZmZmZG7sZmZmRERG7uxERERsrKysrIiL6K7u7u7KysqoruysrIiIiIrAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAABAAAAAgAAAAAQAgAAAAAABABAAAAAAAAAAA + AAAAAAAAAAAAAP/////////////////////4+Pj/09PT/+Xl5f/////////////////9/fz/4+HT/9rY + xv/6+vj/////////////////////////////////hoWF/1NSUv/V1dX/////////////////pKFz/2Zg + Ev/MyrH//////////////////////////////////////4aFhf9TUlL/1dXV////////////y8mv/2Re + D/+loXT//f39//////////////////////////////////////+GhYX/U1JS/9XV1f//////6eje/21n + Hf+BfD3/9vby////////////////////////////////////////////hoWF/1NSUv/V1dX//////4+L + U/9kXhD/v7yc//r59////////////////////////////////////////////4aFhf9TUlL/1dXV//// + ///U0r3/ZV8Q/42JT//W1MD//v7+////////////////////////////5OPj/62trf9mZmb/T05O/56e + nv+5ubn/9vb2/6unff9kXg//qKR4/+Xk1////////////////////////////6Cfn/9FRET/RURE/0VE + RP9FRET/l5eX//j4+P/7+/n/hH9A/2tlGv/Jxqv/+vr4///////////////////////Jycn/dnV1/25t + bf9ycnL/lZWV/9XV1f///////////+/u5/+0sp7/5OPZ////////////////////////////tbS0/0VE + RP9NTU3/SUhI/1BPT/+ura3/9PT0//////++vr7/eHd3/9fX1////////////////////////////7W0 + tP9KSUn/0NDQ/+7u7v9YV1f/d3Z2/+Dg4P/8/Pz/YWBg/0hHR/+wsLD/9/f3//////////////////// + //+1tLT/SklJ/9DQ0P//////jIuL/2FhYf/c3Nz/urm5/0VERP9NTEz/d3Z2/9fX1/////////////// + ////////tbS0/0pJSf/Q0ND//////4KBgf9kZGT/4uLi/15dXf9paGj/m5ub/0lISP+xsbH/9/f3//// + /////////////7W0tP9JSEj/oqKi/5qamv9JSEj/jo2N/7Kysv9FRET/ubm5//Dw8P9LSkr/eHd3/9fX + 1/////////////////+1tLT/RURE/0VERP9FRET/goGB//Hx8f9bWlr/dHNz//T09P//////jYyM/0lI + SP/Jycn//v7+////////////9vb2/+jo6P/o6Oj/8fHx///////6+vr/6Ojo//X19f////////////b2 + 9v/o6Oj/+Pj4//////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA \ No newline at end of file From 1957dd897d2a9bfb1f41d2a2288e851c2601654b Mon Sep 17 00:00:00 2001 From: Bennert de Wijs Date: Mon, 16 Feb 2026 14:09:59 +0100 Subject: [PATCH 2/7] README.md: Add .NET Framework 3.5 SP1 => DVTk Script Support --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ab42654..a6a73f9 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ Note that the DVTk library and DVTk based applications are **not** for clinical i. Development tools for .NET ii. .NET Framework 4.8 development tools + iii. .NET Framework 3.5 SP1 (required to build DVTk Script Support) 2. If you want to add or update the setup files of the installers, then in Visual Studio install Visual Studio extension: Microsoft Visual Studio Installer Projects 2022. The installers are created in the build pipeline. From ede1a7b177e28ab40f4083bf793210398bf82bd2 Mon Sep 17 00:00:00 2001 From: Bennert de Wijs Date: Mon, 16 Feb 2026 14:18:10 +0100 Subject: [PATCH 3/7] Add actions.vs2026.yml --- .github/workflows/actions.vs2026.yml | 445 +++++++++++++++++++++++++++ 1 file changed, 445 insertions(+) create mode 100644 .github/workflows/actions.vs2026.yml diff --git a/.github/workflows/actions.vs2026.yml b/.github/workflows/actions.vs2026.yml new file mode 100644 index 0000000..9427823 --- /dev/null +++ b/.github/workflows/actions.vs2026.yml @@ -0,0 +1,445 @@ +name: DVTk Build (VS2026) + +on: + push: + branches: + - '*' + pull_request: + branches: + - '*' + workflow_dispatch: + +env: + SOLUTION: 'Dicom.sln' + BUILD_PLATFORM: 'x86' + BUILD_CONFIGURATION: 'Release' + +jobs: + build: + runs-on: windows-2025-vs2026 + + steps: + - name: Checkout source code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Install GitVersion + uses: gittools/actions/gitversion/setup@v3.0.0 + with: + versionSpec: '5.x' + preferLatestVersion: true + + - name: Determine version number using GitVersion + id: gitversion + uses: gittools/actions/gitversion/execute@v3.0.0 + with: + useConfigFile: true + configFilePath: 'GitVersion.yml' + updateAssemblyInfo: true + + - name: Setup NuGet + uses: NuGet/setup-nuget@v2 + + - name: Restore Nuget packages + run: nuget restore ${{ env.SOLUTION }} -Verbosity Detailed + + - name: Update Version in project files + shell: pwsh + run: | + ./DVT/updateVersion.ps1 -gitversion "${{ steps.gitversion.outputs.majorMinorPatch }}" + + - name: Update Copyright year in AssemblyInfo files + shell: pwsh + run: | + ./DVT/updateCopyright.ps1 + + - name: Install MFC and ATL (v142 compatibility) + shell: cmd + run: | + "C:\Program Files (x86)\Microsoft Visual Studio\Installer\setup.exe" modify ^ + --installPath "C:\Program Files\Microsoft Visual Studio\2026\Enterprise" ^ + --add Microsoft.VisualStudio.Component.VC.14.29.16.11.ATL ^ + --add Microsoft.VisualStudio.Component.VC.14.29.16.11.MFC ^ + --quiet --norestart + + - name: Verify MFC Headers + shell: pwsh + run: | + $header = Get-ChildItem -Path "C:\Program Files\Microsoft Visual Studio\2026\Enterprise\VC\Tools\MSVC" -Recurse -Filter "afx.h" -ErrorAction SilentlyContinue + if ($header) { + Write-Host "✅ afx.h found in: $($header.FullName)" + } else { + Write-Error "❌ afx.h still not found on disk." + exit 1 + } + + - name: Setup MSBuild + uses: microsoft/setup-msbuild@v2 + with: + vs-version: '[17.0,18.0)' + + - name: Verify MFC Installation + shell: pwsh + run: | + # Gebruik -requires om direct te filteren op de component, dit is betrouwbaarder dan handmatig de lijst doorzoeken + $mfcCheck = & "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" -latest -requires Microsoft.VisualStudio.Component.VC.MFC -property installationPath + + if ($mfcCheck) { + Write-Host "✅ MFC Component is succesvol gedetecteerd in: $mfcCheck" + } else { + Write-Host "⚠️ Waarschuwing: vswhere herkent de component nog niet. We checken nu het bestandssysteem..." + + # Fallback: Check if MFC folders actually exist on disk + $vsPath = & "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" -latest -property installationPath + $mfcHeader = Get-ChildItem -Path "$vsPath\VC\Tools\MSVC" -Recurse -Filter "afxwin.h" -ErrorAction SilentlyContinue + + if ($mfcHeader) { + Write-Host "✅ MFC files found on disk: $($mfcHeader.FullName)" + } else { + Write-Error "❌ MFC Component NOT found (not via vswhere and not on the filesystem)." + exit 1 + } + } + + - name: Locate Devenv and Manual Registry Fix + shell: pwsh + run: | + # Search VS2022 via vswhere + $vsPath = & "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" -version "[17.0,18.0)" -property installationPath + $instanceId = & "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" -version "[17.0,18.0)" -property instanceId + + if (-not $vsPath) { throw "Visual Studio 2022 not found!" } + + # Execute Registry Fix for HRESULT 8000000A + $registryPath = "HKCU:\SOFTWARE\Microsoft\VisualStudio\17.0_$($instanceId)_Config\MSBuild" + if (!(Test-Path $registryPath)) { + New-Item -Path $registryPath -Force | Out-Null + } + Set-ItemProperty -Path $registryPath -Name "EnableOutOfProcBuild" -Value 0 -Type DWord + Write-Host "Registry fix applied to $registryPath" + + $devenv = Join-Path $vsPath "Common7\IDE\devenv.com" + Add-Content -Path $env:GITHUB_ENV -Value "DEV_CMD=$devenv" + + - name: Setup Visual Studio Installer Projects + uses: seanmiddleditch/gha-setup-vsdevenv@v5 + + - name: Build managed/native projects (msbuild) + id: msbuild + shell: pwsh + run: | + New-Item -ItemType Directory -Force -Path ./staging + # Importeer de VS Developer Environment voor x86 + & cmd /c "call `"C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat`" x86 -vcvars_ver=14.2 && msbuild Dicom.sln /t:Rebuild /p:Configuration=Release /p:Platform=x86 /m /fl /flp:LogFile=./staging/build-msbuild.log" + + - name: Build setup projects (devenv) + id: vdproj + continue-on-error: true + shell: pwsh + run: | + $projects = @( + "Definition Files Setup", + "DICOM Compare Setup", + "DICOM Editor Setup", + "DICOM Network Analyzer Setup", + "DVT Examples Setup", + "DVT Setup", + #"Modality Emulator Setup", + "Query Retrieve SCP Emulator Setup", + "Query Retrieve SCU Emulator Setup", + "RIS Emulator Setup", + "Storage SCP Emulator Setup", + "Storage SCU Emulator Setup" + ) + + if (-not (Test-Path "$env:DEV_CMD")) { throw "Error: DEV_CMD (devenv.com) not found on the system." } + + $logPath = "./staging/build-devenv.log" + if (Test-Path $logPath) { Remove-Item $logPath -Force } + + $anyFailure = $false + + foreach ($p in $projects) { + Write-Host "--- Building: $p ---" + + $tempLog = "temp_$($p.Replace(' ', '_')).log" + + $process = Start-Process -FilePath "$env:DEV_CMD" ` + -ArgumentList "`"$env:SOLUTION`"", "/Build", "`"$env:BUILD_CONFIGURATION|$env:BUILD_PLATFORM`"", "/Project", "`"$p`"", "/Out", "$tempLog" ` + -Wait -PassThru + + if (Test-Path $tempLog) { + $content = Get-Content $tempLog + $content | Out-File -FilePath $logPath -Append -Encoding UTF8 + $content | Write-Host # Toon de output ook in de GitHub console + Remove-Item $tempLog + } + + if ($process.ExitCode -ne 0) { + Write-Error "Error during build of $p (Exit code: $($process.ExitCode))" + $anyFailure = $true + } + } + + if ($anyFailure) { exit 1 } + + - name: Install Definition Files for Tests + shell: pwsh + run: | + $targetDir = "C:\Program Files (x86)\Common Files\DVTk\Definition Files\DICOM" + $sourceDir = "Definitions\DICOM" + + Write-Host "Creating definition files directory: $targetDir" + New-Item -ItemType Directory -Force -Path $targetDir | Out-Null + + Write-Host "Copying definition files from $sourceDir to $targetDir" + Copy-Item -Path "$sourceDir\*" -Destination $targetDir -Recurse -Force + + $fileCount = (Get-ChildItem -Path $targetDir -File).Count + Write-Host "Installed $fileCount definition files" + + - name: Run Tests + continue-on-error: true + shell: cmd + run: | + vstest.console.exe ".\bin\Release\*Tests.dll" --logger:trx;LogFileName=../staging/test-results.trx + + - name: Upload Test Results Artifact + uses: actions/upload-artifact@v4 + with: + name: test-results-trx + path: staging/*.trx + + - name: Rename MSI files with version number + shell: pwsh + run: | + $searchPath = "bin\Setups\Release" + $version = "${{ steps.gitversion.outputs.majorMinorPatch }}" + + Write-Host "Search all MSI files in: $searchPath" + + # Get all MSI files (including those with hardcoded versions) + $allMsiFiles = Get-ChildItem -Path $searchPath -Filter "*.msi" -Recurse + + if ($allMsiFiles.Count -eq 0) { + Write-Warning "No MSI files found in $searchPath" + exit 0 + } + + Write-Host "Found $($allMsiFiles.Count) MSI file(s)" + + foreach ($file in $allMsiFiles) { + $newName = $file.Name + + # Replace placeholder version pattern + if ($newName -match '-a\.b\.c\.msi$') { + $newName = $newName -replace '-a\.b\.c\.msi$', "-$version.msi" + Write-Host "Rename (placeholder): $($file.Name) -> $newName" + } + # Keep file with hardcoded version pattern (e.g., -1.1.10.msi) + elseif ($newName -match '-\d+\.\d+\.\d+\.msi$') { + Write-Host "Copy: $newName" + } + # No version pattern found, continue with next file + else { + Write-Warning "Skipping file (no version pattern found): $($file.Name)" + continue + } + + $destination = Join-Path "./staging" $newName + + # Check if target file already exists to prevent errors + if (Test-Path $destination) { + Write-Host " -> File exists, removing old file..." + Remove-Item $destination -Force + } + + Move-Item -Path $file.FullName -Destination $destination -Force + } + Get-ChildItem -Path "./staging" -Filter "*.msi" -Recurse | Select-Object FullName + + - name: Sign MSI files + if: ${{ github.event_name != 'pull_request' }} + shell: pwsh + run: | + # Check if secrets are available + if ([string]::IsNullOrEmpty("${{ secrets.CERTIFICATE_BASE64 }}")) { + Write-Warning "⚠️ CERTIFICATE_BASE64 secret not found. MSI signing will be skipped." + exit 0 + } + + if ([string]::IsNullOrEmpty("${{ secrets.CERTIFICATE_PASSWORD }}")) { + Write-Warning "⚠️ CERTIFICATE_PASSWORD secret not found. MSI signing will be skipped." + exit 0 + } + + Write-Host "📜 Decoding certificate..." + + # Decode the base64 certificate to a file + $certPath = Join-Path $env:TEMP "signing-cert.pfx" + $certPassword = "${{ secrets.CERTIFICATE_PASSWORD }}" + $securePassword = ConvertTo-SecureString -String $certPassword -AsPlainText -Force + + try { + $certBytes = [Convert]::FromBase64String("${{ secrets.CERTIFICATE_BASE64 }}") + [IO.File]::WriteAllBytes($certPath, $certBytes) + Write-Host "✅ Certificate file created: $certPath" + } catch { + Write-Error "❌ Error decoding certificate: $_" + exit 1 + } + + # Verify that the file exists and is readable + if (-not (Test-Path $certPath)) { + Write-Error "❌ Certificate file not found after decode!" + exit 1 + } + + $fileSize = (Get-Item $certPath).Length + Write-Host "Certificate file size: $fileSize bytes" + + # Import the certificate into the certificate store + Write-Host "📥 Importing certificate into certificate store..." + try { + $cert = Import-PfxCertificate -FilePath $certPath -CertStoreLocation Cert:\CurrentUser\My -Password $securePassword -ErrorAction Stop + Write-Host "✅ Certificate imported with thumbprint: $($cert.Thumbprint)" + Write-Host " Subject: $($cert.Subject)" + Write-Host " Valid from: $($cert.NotBefore) to $($cert.NotAfter)" + Write-Host " Has private key: $($cert.HasPrivateKey)" + + if (-not $cert.HasPrivateKey) { + Write-Error "❌ Certificate has no private key!" + exit 1 + } + + $certThumbprint = $cert.Thumbprint + + # Check Enhanced Key Usage + $eku = $cert.EnhancedKeyUsageList | Select-Object -ExpandProperty FriendlyName + Write-Host " Enhanced Key Usage: $($eku -join ', ')" + + if ($eku -notcontains "Code Signing") { + Write-Warning "⚠️ Certificate does not have 'Code Signing' capability. Signing may fail." + } + } catch { + Write-Error "❌ Error importing certificate: $_" + Write-Error " Check if the password is correct!" + Remove-Item $certPath -Force -ErrorAction SilentlyContinue + exit 1 + } + + # Verify that certificate is visible in store + $storeCheck = Get-ChildItem Cert:\CurrentUser\My | Where-Object { $_.Thumbprint -eq $certThumbprint } + if ($storeCheck) { + Write-Host "✓ Certificate is visible in certificate store" + } else { + Write-Error "❌ Certificate not found in store after import!" + exit 1 + } + + # Find signtool.exe - ALWAYS use x64 version for better store access + $signtool = Get-ChildItem -Path "C:\Program Files (x86)\Windows Kits" -Recurse -Filter "signtool.exe" -ErrorAction SilentlyContinue | + Where-Object { $_.FullName -match '\\x64\\' } | + Sort-Object FullName -Descending | + Select-Object -First 1 + + if (-not $signtool) { + Write-Error "❌ signtool.exe not found!" + Remove-Item $certPath -Force -ErrorAction SilentlyContinue + exit 1 + } + + Write-Host "🔧 Using signtool: $($signtool.FullName)" + + # Sign all MSI files in staging + $msiFiles = Get-ChildItem -Path "./staging" -Filter "*.msi" -Recurse + + if ($msiFiles.Count -eq 0) { + Write-Warning "⚠️ No MSI files found to sign." + Remove-Item $certPath -Force -ErrorAction SilentlyContinue + exit 0 + } + + Write-Host "Found $($msiFiles.Count) MSI file(s) to sign" + + $signedCount = 0 + $failedCount = 0 + + foreach ($msi in $msiFiles) { + Write-Host "`n📝 Signing: $($msi.Name)" + + # Sign with certificate thumbprint from store + subject name as fallback + & $signtool.FullName sign /sha1 $certThumbprint /n "DVTk" /tr http://timestamp.digicert.com /td sha256 /fd sha256 /v /debug $msi.FullName + + if ($LASTEXITCODE -eq 0) { + Write-Host "✅ Successfully signed: $($msi.Name)" + $signedCount++ + + # Verify signature - use /a instead of /pa for self-signed certificates + $verifyOutput = & $signtool.FullName verify /a $msi.FullName 2>&1 + $verifyExitCode = $LASTEXITCODE + + if ($verifyExitCode -eq 0) { + Write-Host " ✓ Signature verified (trusted)" + } else { + # For self-signed certificates this is normal + if ($verifyOutput -match "root certificate which is not trusted") { + Write-Host " ⚠ Self-signed certificate (expected for test certificates)" + } else { + Write-Host " ⚠ Signature verification warning" + } + } + + # Reset exit code after verify so the script doesn't fail + $LASTEXITCODE = 0 + } else { + Write-Warning "❌ Failed to sign $($msi.Name) (Exit code: $LASTEXITCODE)" + $failedCount++ + } + } + + # Remove the certificate from store and the file + Write-Host "`n🗑️ Cleaning up..." + try { + Remove-Item "Cert:\CurrentUser\My\$certThumbprint" -Force -ErrorAction SilentlyContinue + Write-Host " Certificate removed from store" + } catch { + Write-Warning " Could not remove certificate from store: $_" + } + Remove-Item $certPath -Force -ErrorAction SilentlyContinue + Write-Host " Certificate file removed" + + Write-Host "`n📊 Summary: $signedCount signed, $failedCount failed" + + if ($failedCount -gt 0) { + Write-Error "❌ Some files failed to sign. Check if certificate and password are correct." + exit 1 + } + + - name: Publish build artifacts + if: ${{ always() }} + uses: actions/upload-artifact@v4 + with: + name: "${{ github.event.repository.name }}-Package-${{ steps.gitversion.outputs.majorMinorPatch }}.${{ steps.gitversion.outputs.preReleaseNumber }}.vs2022" + path: ./staging + + publish-test-results: + runs-on: ubuntu-latest + needs: build + if: always() + permissions: + checks: write + pull-requests: write + contents: read + steps: + - name: Download Test Results + uses: actions/download-artifact@v4 + with: + name: test-results-trx + path: test-results + + - name: Publish Test Results + uses: EnricoMi/publish-unit-test-result-action@v2 + with: + files: "test-results/**/*.trx" \ No newline at end of file From c9cce4aeecc2e5295aa3bf8f2b572b3ad90715cf Mon Sep 17 00:00:00 2001 From: Bennert de Wijs Date: Mon, 16 Feb 2026 14:43:04 +0100 Subject: [PATCH 4/7] actions.vs2026.yml: Remove --quiet option in step Install MFC and ATL (v142 compatibility) --- .github/workflows/actions.vs2026.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/actions.vs2026.yml b/.github/workflows/actions.vs2026.yml index 9427823..2796e09 100644 --- a/.github/workflows/actions.vs2026.yml +++ b/.github/workflows/actions.vs2026.yml @@ -61,7 +61,7 @@ jobs: --installPath "C:\Program Files\Microsoft Visual Studio\2026\Enterprise" ^ --add Microsoft.VisualStudio.Component.VC.14.29.16.11.ATL ^ --add Microsoft.VisualStudio.Component.VC.14.29.16.11.MFC ^ - --quiet --norestart + --norestart - name: Verify MFC Headers shell: pwsh From d4985bc7353bff62b9e4c433d531035272179a06 Mon Sep 17 00:00:00 2001 From: Bennert de Wijs Date: Mon, 16 Feb 2026 14:45:09 +0100 Subject: [PATCH 5/7] actions.vs2026.yml: Update steps with correct Visual Studio version (2026 => 18.0) --- .github/workflows/actions.vs2026.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/actions.vs2026.yml b/.github/workflows/actions.vs2026.yml index 2796e09..378db96 100644 --- a/.github/workflows/actions.vs2026.yml +++ b/.github/workflows/actions.vs2026.yml @@ -77,7 +77,7 @@ jobs: - name: Setup MSBuild uses: microsoft/setup-msbuild@v2 with: - vs-version: '[17.0,18.0)' + vs-version: '[18.0,19.0)' - name: Verify MFC Installation shell: pwsh @@ -105,14 +105,14 @@ jobs: - name: Locate Devenv and Manual Registry Fix shell: pwsh run: | - # Search VS2022 via vswhere - $vsPath = & "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" -version "[17.0,18.0)" -property installationPath - $instanceId = & "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" -version "[17.0,18.0)" -property instanceId + # Search VS2026 via vswhere + $vsPath = & "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" -version "[18.0,19.0)" -property installationPath + $instanceId = & "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" -version "[18.0,19.0)" -property instanceId - if (-not $vsPath) { throw "Visual Studio 2022 not found!" } + if (-not $vsPath) { throw "Visual Studio 2026 not found!" } # Execute Registry Fix for HRESULT 8000000A - $registryPath = "HKCU:\SOFTWARE\Microsoft\VisualStudio\17.0_$($instanceId)_Config\MSBuild" + $registryPath = "HKCU:\SOFTWARE\Microsoft\VisualStudio\18.0_$($instanceId)_Config\MSBuild" if (!(Test-Path $registryPath)) { New-Item -Path $registryPath -Force | Out-Null } @@ -421,7 +421,7 @@ jobs: if: ${{ always() }} uses: actions/upload-artifact@v4 with: - name: "${{ github.event.repository.name }}-Package-${{ steps.gitversion.outputs.majorMinorPatch }}.${{ steps.gitversion.outputs.preReleaseNumber }}.vs2022" + name: "${{ github.event.repository.name }}-Package-${{ steps.gitversion.outputs.majorMinorPatch }}.${{ steps.gitversion.outputs.preReleaseNumber }}.vs2026" path: ./staging publish-test-results: From 3c7aa75b1b69a2174cf4c0498124d610de91810a Mon Sep 17 00:00:00 2001 From: Bennert de Wijs Date: Mon, 16 Feb 2026 16:13:35 +0100 Subject: [PATCH 6/7] actions.vs2026.yml: Add step to determne Visual Studio installation path --- .github/workflows/actions.vs2026.yml | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/.github/workflows/actions.vs2026.yml b/.github/workflows/actions.vs2026.yml index 378db96..0494b59 100644 --- a/.github/workflows/actions.vs2026.yml +++ b/.github/workflows/actions.vs2026.yml @@ -54,11 +54,22 @@ jobs: run: | ./DVT/updateCopyright.ps1 + - name: Detect Visual Studio installation path + shell: pwsh + run: | + $vsPath = & "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" -version "[18.0,19.0)" -property installationPath + if (-not $vsPath) { + Write-Error "Visual Studio 2026 not found!" + exit 1 + } + Write-Host "✅ Visual Studio found at: $vsPath" + Add-Content -Path $env:GITHUB_ENV -Value "VS_INSTALL_PATH=$vsPath" + - name: Install MFC and ATL (v142 compatibility) shell: cmd run: | "C:\Program Files (x86)\Microsoft Visual Studio\Installer\setup.exe" modify ^ - --installPath "C:\Program Files\Microsoft Visual Studio\2026\Enterprise" ^ + --installPath "%VS_INSTALL_PATH%" ^ --add Microsoft.VisualStudio.Component.VC.14.29.16.11.ATL ^ --add Microsoft.VisualStudio.Component.VC.14.29.16.11.MFC ^ --norestart @@ -66,7 +77,7 @@ jobs: - name: Verify MFC Headers shell: pwsh run: | - $header = Get-ChildItem -Path "C:\Program Files\Microsoft Visual Studio\2026\Enterprise\VC\Tools\MSVC" -Recurse -Filter "afx.h" -ErrorAction SilentlyContinue + $header = Get-ChildItem -Path "$env:VS_INSTALL_PATH\VC\Tools\MSVC" -Recurse -Filter "afx.h" -ErrorAction SilentlyContinue if ($header) { Write-Host "✅ afx.h found in: $($header.FullName)" } else { @@ -105,11 +116,10 @@ jobs: - name: Locate Devenv and Manual Registry Fix shell: pwsh run: | - # Search VS2026 via vswhere - $vsPath = & "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" -version "[18.0,19.0)" -property installationPath + # Get instance ID for registry fix $instanceId = & "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" -version "[18.0,19.0)" -property instanceId - if (-not $vsPath) { throw "Visual Studio 2026 not found!" } + if (-not $instanceId) { throw "Visual Studio instance ID not found!" } # Execute Registry Fix for HRESULT 8000000A $registryPath = "HKCU:\SOFTWARE\Microsoft\VisualStudio\18.0_$($instanceId)_Config\MSBuild" @@ -119,7 +129,7 @@ jobs: Set-ItemProperty -Path $registryPath -Name "EnableOutOfProcBuild" -Value 0 -Type DWord Write-Host "Registry fix applied to $registryPath" - $devenv = Join-Path $vsPath "Common7\IDE\devenv.com" + $devenv = Join-Path $env:VS_INSTALL_PATH "Common7\IDE\devenv.com" Add-Content -Path $env:GITHUB_ENV -Value "DEV_CMD=$devenv" - name: Setup Visual Studio Installer Projects @@ -131,7 +141,7 @@ jobs: run: | New-Item -ItemType Directory -Force -Path ./staging # Importeer de VS Developer Environment voor x86 - & cmd /c "call `"C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat`" x86 -vcvars_ver=14.2 && msbuild Dicom.sln /t:Rebuild /p:Configuration=Release /p:Platform=x86 /m /fl /flp:LogFile=./staging/build-msbuild.log" + & cmd /c "call `"$env:VS_INSTALL_PATH\VC\Auxiliary\Build\vcvarsall.bat`" x86 -vcvars_ver=14.29 && msbuild Dicom.sln /t:Rebuild /p:Configuration=Release /p:Platform=x86 /m /fl /flp:LogFile=./staging/build-msbuild.log" - name: Build setup projects (devenv) id: vdproj From 27e80d741d728e0b0e2b7096c42d90de85744134 Mon Sep 17 00:00:00 2001 From: Bennert de Wijs Date: Mon, 16 Feb 2026 16:19:54 +0100 Subject: [PATCH 7/7] Revert "actions.vs2026.yml: Remove --quiet option in step Install MFC and ATL (v142 compatibility)" This reverts commit c9cce4aeecc2e5295aa3bf8f2b572b3ad90715cf. --- .github/workflows/actions.vs2026.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/actions.vs2026.yml b/.github/workflows/actions.vs2026.yml index 0494b59..9698b8c 100644 --- a/.github/workflows/actions.vs2026.yml +++ b/.github/workflows/actions.vs2026.yml @@ -72,7 +72,7 @@ jobs: --installPath "%VS_INSTALL_PATH%" ^ --add Microsoft.VisualStudio.Component.VC.14.29.16.11.ATL ^ --add Microsoft.VisualStudio.Component.VC.14.29.16.11.MFC ^ - --norestart + --quiet --norestart - name: Verify MFC Headers shell: pwsh