我正在学习如何为wix-burn开发自定义托管引导程序.根据我的知识,没有正式的教程,非官方的教程总是充满了我不感兴趣的WPF内容,论坛上的大多数人做的不仅仅是说你必须创建一个继承自BootstrapperApplication的类并覆盖Run()方法.
我这样做了,创建了配置文件,将有效负载添加到xml标记中.由此产生的安装程序什么也没做,实际上它永远运行,只有杀死它才能阻止它 我真诚地期望调用base.Run()会给我一些基本的默认的无GUI行为.但这只是一种抽象的方法.最后我了解到我必须调用一些Engine.functions()来实际做一些工作.所以我写这个测试:
protected override void Run()
{
Engine.Detect();
Engine.Plan(LaunchAction.Install);
Engine.Apply(IntPtr.Zero);
Engine.Quit(0);
}
Run Code Online (Sandbox Code Playgroud)
我成功编译了一个实际安装的软件包,问题是它无法卸载.我的问题是,我该怎样做才能从我的系统中清除它?我必须删除哪些注册表项,必须删除哪些缓存包,以及我还必须做些什么来摆脱它?
我知道我无法从DllMain创建线程,但在DLL中创建线程的正确方法是什么?
我试图创建一个包装它的类并声明该类的全局实例,但WaitForSingleObject在类的析构函数中挂起,即使我确定该线程已退出.
这是我从exe加载DLL的示例程序:
#include <Windows.h>
#include <iostream>
using namespace std;
int main(int argc, TCHAR* argv[])
{
HMODULE module = LoadLibraryA("dll.dll");
Sleep(500);
if (module) FreeModule(module);
else cout << "failed to load library...\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是dll代码:
#include <Windows.h>
#include <iostream>
using namespace std;
class X
{
HANDLE thread = NULL;
static DWORD WINAPI run_thread(LPVOID param)
{
cout << "dll.cpp: thread started\n";
Sleep(1000);
cout << "dll.cpp: thread is exiting\n";
return 0;
}
public:
X()
{
DWORD tmp;
thread = CreateThread(NULL, 0, run_thread, …
Run Code Online (Sandbox Code Playgroud)