Я работаю с TightVNC и хотел бы создать приложение, подобное SingleClick UltraVNC. Проблема, с которой я сталкиваюсь, заключается в том, что серверный модуль tvnserver.exe
должен запускаться дважды из командной строки: один раз для запуска сервера и второй раз для инициации исходящего соединения. Просматривая исходный код, я сузил его до этого блока кода, который находится в файле tvnserver-app\TvnServerApplication.cpp
:
int TvnServerApplication::run()
{
// FIXME: May be an unhandled exception.
// Check wrong command line and situation when we need to show help.
try {
ServerCommandLine parser;
WinCommandLineArgs cmdArgs(m_commandLine.getString());
if (!parser.parse(&cmdArgs) || parser.showHelp()) {
throw Exception(_T("Wrong command line argument"));
}
} catch (...) {
TvnServerHelp::showUsage();
return 0;
}
// Reject 2 instances of TightVNC server application.
GlobalMutex *appInstanceMutex;
try {
appInstanceMutex = new GlobalMutex(
ServerApplicationNames::SERVER_INSTANCE_MUTEX_NAME, false, true);
} catch (...) {
MessageBox(0,
StringTable::getString(IDS_SERVER_ALREADY_RUNNING),
StringTable::getString(IDS_MBC_TVNSERVER), MB_OK | MB_ICONEXCLAMATION);
return 1;
}
// Start TightVNC server and TightVNC control application.
try {
m_tvnServer = new TvnServer(false, m_newConnectionEvents, this, &m_fileLogger);
m_tvnServer->addListener(this);
m_tvnControlRunner = new WsConfigRunner(&m_fileLogger);
int exitCode = WindowsApplication::run();
delete m_tvnControlRunner;
m_tvnServer->removeListener(this);
delete m_tvnServer;
delete appInstanceMutex;
return exitCode;
} catch (Exception &e) {
// FIXME: Move string to resource
StringStorage message;
message.format(_T("Couldn't run the server: %s"), e.getMessage());
MessageBox(0,
message.getString(),
_T("Server error"), MB_OK | MB_ICONEXCLAMATION);
return 1;
}
}
Что мне нужно сделать, так это многопоточность последней области попытки, в которой он выполняется:
int exitCode = WindowsApplication::run();
Я пытался следовать этому уроку: https://www.bogotobogo.com/cplusplus/multithreading_win32A.php переместил этот блок попытки внутрь раздела myThread
, но тогда все остальные вещи, такие как m_tvnServer
, не определены.
Я хотел бы запустить поток 2 раза, один раз с аргументом командной строки -run
и второй раз с помощью -connect support.mydns.com
. Я думал что-то вроде этого:
unsigned int myCounter = 0;
DWORD myThreadID;
string CommandLineArgs[2] = {"-run", "-connect support.mydns.com"};
for(int i=0; i<2; i++) {
HANDLE myHandle = CreateThread(0, 0, myThread, CommandLineArgs[i];, 0, &myThreadID;);
}
Буду признателен за любую помощь, которую вы можете предложить.