动态加载库
Win
HMODULE hmodule = LoadLibrary("my.dll");
Func fun = (Func)GetProcAddress(hmodule, "func");
FreeLibrary(hmodule);
linux (编译参数 -rdynamic -ldl )
hmodule = dlopen("my.so", RTLD_LAZY);
Func fun = (Func)dlsym(hmodule, "func");
dlclose(handle);
mac
linux mac
hmodule = dlopen("my.dylib", RTLD_GLOBAL);
Func fun = (Func)dlsym(hmodule, "func");
dlclose(hmodule);
创建进程
Win
STARTUPINFO si = { 0 };
PROCESS_INFORMATION pi = { 0 };
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;//指定wShowWindow成员有效
si.wShowWindow = TRUE;//此成员设为TRUE的话则显示新建进程的主窗口
wcscpy_s(szExecFile, 2048, szUpdateApp);
if (CreateProcessW(nullptr, szExecFile, nullptr, nullptr, FALSE, DETACHED_PROCESS, nullptr, nullptr, &si, &pi))
{
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
DWORD dwExitCode = DWORD(-1);
PROCESS_INFORMATION pi = { 0 };
STARTUPINFO si = { 0 };
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW; //指定wShowWindow成员有效
si.wShowWindow = FALSE; //此成员设为TRUE的话则显示新建进程的主窗口
if (CreateProcessA(nullptr, szExecFile, nullptr, nullptr, FALSE, CREATE_SUSPENDED, nullptr, nullptr, &si, &pi))
{
::ResumeThread(pi.hThread);
WaitForSingleObject(pi.hProcess, INFINITE);
GetExitCodeProcess(pi.hProcess, &dwExitCode);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
else
{
dwExitCode = GetLastError();
}