Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.88/34: Рейтинг темы: голосов - 34, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 21.03.2015
Сообщений: 29

Отслеживание закрытия файла процессом, запущенным через CreateProcess

23.07.2015, 18:18. Показов 7654. Ответов 49
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Возникла нетривиальная(на мой взгляд) задачка: Открываем какой нибудь файл через какую нибудь программу(условно говоря file.docx с помощью MS Word) и нужно отследить закрытие этого файла.
Запуск осуществляю с помощью CreateProcess, а именно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
STARTUPINFO si;
PROCESS_INFORMATION pi;
 
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
 
CreateProcess
    (
        TEXT("C:\\Program Files (x86)\\Microsoft Office\\Office15\\WINWORD.EXE"),
        L"/t C:\\Temp\\file.docx", NULL, NULL, TRUE,
        CREATE_NEW_CONSOLE,
        NULL, NULL,
        &si,
        &pi
    );
Далее казалось бы всё просто, мониторь себе список запущенных процессов по pi.dwProcessId и всё.
Но есть одно но. Если при этом будет запущен ещё какой либо файл (например something.docx), то он запустится в том же процессе и в таком случае при закрытии отслеживаемого файла, процесс останется. И я не смогу своевременно отреагировать на его закрытие

Вопрос в том можно ли как то отследить закрытие конкретного файла в программе?? Или же можно запустить процесс выполнения программы так, что бы при выполнении других файлов такого типа, они выполнялись в другом процессе??
Помогите пожалуйста(
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.07.2015, 18:18
Ответы с готовыми решениями:

Как дождаться закрытия файла другим процессом/потоком
Всем привет. Допустим известно имя файла. Необходимо: * найти его. * если его сейчас использует другой процесс/поток, то дождаться...

Получить список dll, используемых запущенным процессом
Делаю античит для сетевой игры(готовых решений нет) по способу белого\черного листов и сверкой md5 dll модулей, нужно получить список dll...

Отслеживание создания файлов чужим процессом
Здравствуйте. Возникла проблемка с отслеживанием создания новых файлов в определенной папке чужим процессом (видео-проигрыватель). Этот...

49
0 / 0 / 0
Регистрация: 21.03.2015
Сообщений: 29
09.09.2015, 12:23  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Убежденный Посмотреть сообщение
Путь к dll задан в char-символах, а удаленный поток зовет LoadLibraryW,
которому нужна строка в wchar_t-символах. Да, и MSDN крайне не советует
звать MessageBox из DllMain...
Путь к Dll поменял на
C++
1
const wchar_t* dll = L"c:\\users\\adam\\documents\\visual studio 2015\\Projects\\HookDll\\Debug\\HookDll.dll";
MessageBox из DllMain убрал. Лог файл Dll всё равно не создаётся.
Через монитор ресурсов смотрю связанные модули с процессом WINWORD.EXE, HookDll.dll там нет((
В чём ещё может быть проблема?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
09.09.2015, 12:26
Цитата Сообщение от AdamWest Посмотреть сообщение
В чём ещё может быть проблема?
Где код ?

Цитата Сообщение от AdamWest Посмотреть сообщение
Лог файл Dll всё равно не создаётся.
Писать в корень системного диска могут только администраторы и система.
Может, дело еще в этом ?
0
0 / 0 / 0
Регистрация: 21.03.2015
Сообщений: 29
09.09.2015, 12:41  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Путь к dll задан в char-символах, а удаленный поток зовет LoadLibraryW,
которому нужна строка в wchar_t-символах.
1. Путь к dll заменил на:
C++
1
const wchar_t* dll = L"c:\\users\\adam\\documents\\visual studio 2015\\Projects\\HookDll\\Debug\\HookDll.dll\0";
2. strlen(dll) заменил на wcslen(dll) + 1

3. MessageBox из dll убрал

4. в Dll путь к логу поменял на: C:\\Temp\\temp.txt
Код из dll всё равно не отрабатывает(Файл temp.txt не создаётся).
Смотрю через монитор ресурсов связанные модули с процессом WINWORD.EXE, в списке нет моей dll((

В чём ещё может быть проблема?

Полный код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include "stdafx.h"
#include <iostream>
#include <string>
#include <windows.h>
#include <tlhelp32.h>
#include <Aclapi.h>
 
 
#include <Winternl.h> 
using namespace std;
 
 
void injectDLL(HANDLE hProcess)
{
 
    const wchar_t* dll = L"c:\\users\\adam\\documents\\visual studio 2015\\Projects\\HookDll\\Debug\\HookDll.dll\0";
    
    LPVOID lpSpace = (LPVOID)VirtualAllocEx(hProcess, NULL, wcslen(dll) + 1, MEM_COMMIT, PAGE_READWRITE);
    int n = WriteProcessMemory(hProcess, lpSpace, dll, wcslen(dll) + 1, NULL);
    size_t sDll = wcslen(dll);
    HMODULE hModule = GetModuleHandle(L"kernel32.dll");
    LPVOID lpBaseAddress = (LPVOID)GetProcAddress(hModule, "LoadLibraryW");
    
    HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)lpBaseAddress, lpSpace, NULL, NULL);
    DWORD threadId = GetThreadId(hThread);
    DWORD processId = GetProcessIdOfThread(hThread);
    printf("Injected thread id: %u for pid: %u", threadId, processId);
    
};
 
 
VOID EnumModuleList(HANDLE CONST hStdOut, DWORD CONST dwProcessId, HANDLE hLauncher)
{
    MODULEENTRY32 meModuleEntry;
    TCHAR szBuff[1024];
    DWORD dwTemp;
    HANDLE CONST hSnapshot = CreateToolhelp32Snapshot(
        TH32CS_SNAPMODULE, dwProcessId);
    if (INVALID_HANDLE_VALUE == hSnapshot) {
        return;
    }
    //while (true) {}
    meModuleEntry.dwSize = sizeof(MODULEENTRY32);
    Module32First(hSnapshot, &meModuleEntry);
    string str = "kernel32.dll";
    wstring w_str(str.begin(), str.end());
    do {
        if (meModuleEntry.szModule == w_str)
        {
            injectDLL(hLauncher);
            break;
        }
    } while (Module32Next(hSnapshot, &meModuleEntry));
 
    CloseHandle(hSnapshot);
}//*/
 
int main()
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
 
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));
 
    CreateProcessW
        (
            TEXT("C:\\Program Files (x86)\\Microsoft Office\\Office15\\WINWORD.EXE"),
            L"/t C:\\Temp\\sendMEplease.docx", NULL, NULL, TRUE,
            CREATE_NEW_CONSOLE,
            NULL, NULL,
            &si,
            &pi
            );
 
    PROCESSENTRY32 peProcessEntry;
    TCHAR szBuff[1024];
    DWORD dwTemp;
    HANDLE CONST hSnapshot = CreateToolhelp32Snapshot(
        TH32CS_SNAPPROCESS, pi.dwProcessId);
    if (INVALID_HANDLE_VALUE == hSnapshot) {
        return 0;
    }
    HANDLE CONST hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    peProcessEntry.dwSize = sizeof(PROCESSENTRY32);
    Process32First(hSnapshot, &peProcessEntry);
    do {
        if (peProcessEntry.th32ProcessID == pi.dwProcessId)
        {
            EnumModuleList(hStdOut, peProcessEntry.th32ProcessID, pi.hProcess);
            break;
        }
    } while (Process32Next(hSnapshot, &peProcessEntry));
    
    CloseHandle(hSnapshot);
    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);//*/
    return 0;
}

DLL:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <winsock2.h>
#include <windows.h>
 
INT APIENTRY DllMain(HMODULE hDll, DWORD Reason, LPVOID Reserved)
{
    FILE *file;
    fopen_s(&file, "C:\\Temp\\temp.txt", "a+");
 
    switch (Reason)
    {
    case DLL_PROCESS_ATTACH:
        fprintf(file, "DLL attach function called.n");
        break;
    case DLL_PROCESS_DETACH:
        fprintf(file, "DLL detach function called.n");
        break;
    case DLL_THREAD_ATTACH:
        fprintf(file, "DLL thread attach function called.n");
        break;
    case DLL_THREAD_DETACH:
        fprintf(file, "DLL thread detach function called.n");
        break;
    }
 
    fclose(file);
    return TRUE;
}
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
09.09.2015, 12:58
VirtualAlloc(Ex) и WriteProcessMemory работают с количеством байт.
wcslen возвращает количество символов.
Правильно так:
C
1
size_t const SizeOfPayload = (wcslen(path) + 1) * sizeof (wchar_t);
0
0 / 0 / 0
Регистрация: 21.03.2015
Сообщений: 29
09.09.2015, 14:27  [ТС]
Убежденный, Переделал на количество байт и всё равно dll не отработала((
Может я ещё где то допустил ошибку?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
09.09.2015, 15:59
И снова спрошу: где код (последняя версия) ?
0
0 / 0 / 0
Регистрация: 21.03.2015
Сообщений: 29
09.09.2015, 16:15  [ТС]
Убежденный,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include "stdafx.h"
#include <iostream>
#include <string>
#include <windows.h>
//#include <fstream>
#include <tlhelp32.h>
#include <Aclapi.h>
//#include "MinHook.h"
 
 
#include <Winternl.h> 
using namespace std;
 
typedef int (WINAPI* HookChangeType)(int);
 
void injectDLL(HANDLE hProcess)
{
 
    const wchar_t* dll = L"c:\\users\\adam\\documents\\visual studio 2015\\Projects\\HookDll\\Debug\\HookDll.dll\0";
 
    size_t const DLLPathSize = (wcslen(dll) + 1) * sizeof(wchar_t);
 
    LPVOID lpSpace = (LPVOID)VirtualAllocEx(hProcess, NULL, DLLPathSize, MEM_COMMIT, PAGE_READWRITE);
    int n = WriteProcessMemory(hProcess, lpSpace, dll, DLLPathSize, NULL);
    HMODULE hModule = GetModuleHandle(L"kernel32.dll");
    LPVOID lpBaseAddress = (LPVOID)GetProcAddress(hModule, "LoadLibraryW");
    
    HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)lpBaseAddress, lpSpace, NULL, NULL);
    DWORD threadId = GetThreadId(hThread);
    DWORD processId = GetProcessIdOfThread(hThread);
    printf("Injected thread id: %u for pid: %u", threadId, processId);
};
 
 
VOID EnumModuleList(HANDLE CONST hStdOut, DWORD CONST dwProcessId, HANDLE hLauncher)
{
    MODULEENTRY32 meModuleEntry;
    TCHAR szBuff[1024];
    DWORD dwTemp;
    HANDLE CONST hSnapshot = CreateToolhelp32Snapshot(
        TH32CS_SNAPMODULE, dwProcessId);
    if (INVALID_HANDLE_VALUE == hSnapshot) {
        return;
    }
    
    meModuleEntry.dwSize = sizeof(MODULEENTRY32);
    Module32First(hSnapshot, &meModuleEntry);
    string str = "kernel32.dll";
    wstring w_str(str.begin(), str.end());
    do {
        if (meModuleEntry.szModule == w_str)
        {
            injectDLL(hLauncher);
            break;
        }
    } while (Module32Next(hSnapshot, &meModuleEntry));
 
    CloseHandle(hSnapshot);
}//*/
 
int main()
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
 
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));
 
    //MH_Initialize();
    CreateProcessW
        (
            TEXT("C:\\Program Files (x86)\\Microsoft Office\\Office15\\WINWORD.EXE"),
            L"/t C:\\Temp\\sendMEplease.docx", NULL, NULL, TRUE,
            CREATE_NEW_CONSOLE,
            NULL, NULL,
            &si,
            &pi
            );
 
    PROCESSENTRY32 peProcessEntry;
    TCHAR szBuff[1024];
    DWORD dwTemp;
    HANDLE CONST hSnapshot = CreateToolhelp32Snapshot(
        TH32CS_SNAPPROCESS, pi.dwProcessId);
    if (INVALID_HANDLE_VALUE == hSnapshot) {
        return 0;
    }
    HANDLE CONST hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    peProcessEntry.dwSize = sizeof(PROCESSENTRY32);
    Process32First(hSnapshot, &peProcessEntry);
    do {
        if (peProcessEntry.th32ProcessID == pi.dwProcessId)
        {
            EnumModuleList(hStdOut, peProcessEntry.th32ProcessID, pi.hProcess);
            break;
        }
    } while (Process32Next(hSnapshot, &peProcessEntry));
    
    CloseHandle(hSnapshot);
    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);//*/
    return 0;
}

DLL:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <winsock2.h>
#include <windows.h>
 
INT APIENTRY DllMain(HMODULE hDll, DWORD Reason, LPVOID Reserved)
{
    FILE *file;
    fopen_s(&file, "C:\\Temp\\temp.txt", "a+");
 
    switch (Reason)
    {
    case DLL_PROCESS_ATTACH:
        fprintf(file, "DLL attach function called.n");
        break;
    case DLL_PROCESS_DETACH:
        fprintf(file, "DLL detach function called.n");
        break;
    case DLL_THREAD_ATTACH:
        fprintf(file, "DLL thread attach function called.n");
        break;
    case DLL_THREAD_DETACH:
        fprintf(file, "DLL thread detach function called.n");
        break;
    }
 
    fclose(file);
    return TRUE;
}
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
09.09.2015, 16:31
А функция injectDLL вообще вызывается ?
И что-то мне кажется, все эти манипуляции с CreateToolhelp32Snapshot и
поиском kernel32 лишены смысла. Все равно поток с CreateRemoteThread
не запустится, пока не прогрузится kernel32 и все остальные статически
прилинкованные dll-ки.

Короче, в данном случае можно звать injectDLL сразу после успешного
вызова CreateProcessW.
0
0 / 0 / 0
Регистрация: 21.03.2015
Сообщений: 29
09.09.2015, 16:50  [ТС]
injectDLL - вызывается, заходил туда отладчиком.

Удалил все махинации с CreateToolhelp32Snapshot и прочим. На результат никак не повлияло.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include "stdafx.h"
#include <iostream>
#include <string>
#include <windows.h>
#include <thread>
#include <tlhelp32.h>
#include <Aclapi.h>
#include <Winternl.h> 
using namespace std;
 
void injectDLL(HANDLE hProcess)
{
    const wchar_t* dll = L"c:\\users\\adam\\documents\\visual studio 2015\\Projects\\HookDll\\Debug\\HookDll.dll\0";
 
    size_t const DLLPathSize = (wcslen(dll) + 1) * sizeof(wchar_t);
 
    LPVOID lpSpace = (LPVOID)VirtualAllocEx(hProcess, NULL, DLLPathSize, MEM_COMMIT, PAGE_READWRITE);
    int n = WriteProcessMemory(hProcess, lpSpace, dll, DLLPathSize, NULL);
    HMODULE hModule = GetModuleHandle(L"kernel32.dll");
    LPVOID lpBaseAddress = (LPVOID)GetProcAddress(hModule, "LoadLibraryW");
    
    HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)lpBaseAddress, lpSpace, NULL, NULL);
    DWORD threadId = GetThreadId(hThread);
    DWORD processId = GetProcessIdOfThread(hThread);
    printf("Injected thread id: %u for pid: %u", threadId, processId);
};
 
int main()
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
 
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));
 
    CreateProcessW
        (
            TEXT("C:\\Program Files (x86)\\Microsoft Office\\Office15\\WINWORD.EXE"),
            L"/t C:\\Temp\\sendMEplease.docx", NULL, NULL, TRUE,
            CREATE_NEW_CONSOLE,
            NULL, NULL,
            &si,
            &pi
            );
 
    injectDLL(pi.hProcess);
    
    return 0;
}
В DLL ничего не менял.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
09.09.2015, 17:23
Как на счет проверить, что возвращают функции VirtualAllocEx, WriteVirtualMemory,
GetProcAddress и CreateRemoteThread ?
0
0 / 0 / 0
Регистрация: 21.03.2015
Сообщений: 29
09.09.2015, 17:56  [ТС]
Убежденный, проставил проверки. Всё корректно отрабатывает до конца, в консоль выводится только 2 сообщения последних строк injectDll(Injected thread id: threadId for pid: processId " и FINISH INJECT соответственно)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <windows.h>
#include <thread>
#include <tlhelp32.h>
#include <Aclapi.h>
#include <Winternl.h> 
using namespace std;
 
 
void injectDLL(HANDLE hProcess)
{
    const wchar_t* dll = L"c:\\users\\adam\\documents\\visual studio 2015\\Projects\\HookDll\\Debug\\HookDll.dll\0";
 
    size_t const DLLPathSize = (wcslen(dll) + 1) * sizeof(wchar_t);
 
    LPVOID lpSpace = (LPVOID)VirtualAllocEx(hProcess, NULL, DLLPathSize, MEM_COMMIT, PAGE_READWRITE);
    if (lpSpace == NULL)
    {
        cout << "Could not allocate memory in process" << endl;
        return;
    }
 
    int n = WriteProcessMemory(hProcess, lpSpace, dll, DLLPathSize, NULL);
    if (n == 0)
    {
        cout << "Could not write to process's address space" << endl;
        return;
    }
    HMODULE hModule = GetModuleHandle(L"kernel32.dll");
    LPVOID lpBaseAddress = (LPVOID)GetProcAddress(hModule, "LoadLibraryW");
    if (lpBaseAddress == NULL)
    {
        cout<<"Unable to locate LoadLibraryW"<<endl;
        return;
    }
    
    HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)lpBaseAddress, lpSpace, NULL, NULL);
    if (hThread == NULL)
    {
        cout << "hThread is NULL" << endl;
        return;
    }
    DWORD threadId = GetThreadId(hThread);
    DWORD processId = GetProcessIdOfThread(hThread);
    printf("Injected thread id: %u for pid: %u", threadId, processId);
    cout << "FINISH INJECT" << endl;
 
};
 
int main()
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
 
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));
 
    CreateProcessW
        (
            TEXT("C:\\Program Files (x86)\\Microsoft Office\\Office15\\WINWORD.EXE"),
            L"/t C:\\Temp\\sendMEplease.docx", NULL, NULL, TRUE,
            CREATE_NEW_CONSOLE,
            NULL, NULL,
            &si,
            &pi
            );
 
    injectDLL(pi.hProcess);
 
    return 0;
}
Миниатюры
Отслеживание закрытия файла процессом, запущенным через CreateProcess  
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
09.09.2015, 17:59
Цитата Сообщение от AdamWest Посмотреть сообщение
Всё корректно отрабатывает до конца
Так в чем тогда проблема ?
0
0 / 0 / 0
Регистрация: 21.03.2015
Сообщений: 29
09.09.2015, 18:19  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Так в чем тогда проблема ?
Код из DLL не выполняется. под фразой "всё корректно отрабатывает до конца" я имел ввиду что все функции возвращают не нулевые значения и программа отрабатывает до конца

DLL
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <winsock2.h>
#include <windows.h>
 
INT APIENTRY DllMain(HMODULE hDll, DWORD Reason, LPVOID Reserved)
{
    FILE *file;
    fopen_s(&file, "C:\\Temp\\temp.txt", "a+");
 
    switch (Reason)
    {
    case DLL_PROCESS_ATTACH:
        fprintf(file, "DLL attach function called.n");
        break;
    case DLL_PROCESS_DETACH:
        fprintf(file, "DLL detach function called.n");
        break;
    case DLL_THREAD_ATTACH:
        fprintf(file, "DLL thread attach function called.n");
        break;
    case DLL_THREAD_DETACH:
        fprintf(file, "DLL thread detach function called.n");
        break;
    }
 
    fclose(file);
    return TRUE;
}
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
09.09.2015, 18:30
Если всё работает, тогда твоя длл должна быть в процессе. Посмотри с помощью process explorer загрузилось ли. Вообще держи его открытым чтобы увидеть создание/провал создания удалённого потока.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
09.09.2015, 18:34
Цитата Сообщение от AdamWest Посмотреть сообщение
Код из DLL не выполняется.
А ты уверен, что MS Office, который запускается из CreateProcessW,
может писать в C:\Windows\Temp ? У меня в эту папку без прав
администратора даже заглянуть нельзя...
0
0 / 0 / 0
Регистрация: 21.03.2015
Сообщений: 29
09.09.2015, 18:39  [ТС]
Цитата Сообщение от Enno Посмотреть сообщение
Если всё работает, тогда твоя длл должна быть в процессе
Через монитор ресурсов нашёл свою Dll в списке связанных модулей с процессом WINWORD.EXE. Но почему не отрабатывает DllMain из моей DLL? (не создаётся файл "C:\\Temp\\temp.txt")

Добавлено через 39 секунд
Цитата Сообщение от Убежденный Посмотреть сообщение
C:\Windows\Temp
Там папка c:\Temp\
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
09.09.2015, 19:11
Цитата Сообщение от AdamWest Посмотреть сообщение
Но почему не отрабатывает DllMain
Используй CreateFile и WriteFile, выводи ошибки в MessageBox'ах.

Добавлено через 24 секунды
Цитата Сообщение от AdamWest Посмотреть сообщение
Там папка c:\Temp\
Она существует вообще?
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
09.09.2015, 21:27
Попробовал натравить свою поделку на Winword.exe (ver.2003). У меня лог нормально создается в c:\temp.

Может стоит последовать рекомендациям из моей темы и проверить каждую деталь.
0
0 / 0 / 0
Регистрация: 21.03.2015
Сообщений: 29
10.09.2015, 10:54  [ТС]
Цитата Сообщение от Enno Посмотреть сообщение
Используй CreateFile и WriteFile, выводи ошибки в MessageBox'ах.
Написал создание файла используя CreateFile и WriteFile, вот только MessageBox не показывает сообщения, даже из первой строки DllMain, printf тоже. Поэтому мне кажется что код DLL совсем не отрабатывает. Мб Dll нужно компилировать с каким нибудь до ключом?(Использую VS 2015)

Цитата Сообщение от Enno Посмотреть сообщение
Она существует вообще?
Да. существует.


Цитата Сообщение от Dragokas Посмотреть сообщение
Попробовал натравить свою поделку на Winword.exe (ver.2003). У меня лог нормально создается в c:\temp.
Может стоит последовать рекомендациям из моей темы и проверить каждую деталь.
Word у меня 2013 версии. А в итоге в чём была Ваша ошибка?

Dll:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <stdio.h>
#include <winsock2.h>
#include <windows.h>
#include <iostream>
#include <thread>
using namespace std;
 
void logIt()
{
    HANDLE hFile;
    char DataBuffer[] = "This is some test data to write to the file.";
    DWORD dwBytesToWrite = (DWORD)strlen(DataBuffer);
    DWORD dwBytesWritten = 0;
    BOOL bErrorFlag = FALSE;
 
    hFile = CreateFile(L"C:\\Temp\\temp.txt", GENERIC_WRITE, 0, NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL); 
 
    if (hFile == INVALID_HANDLE_VALUE)
    {
        printf("Cannot create file.\n");
                MessageBox(NULL, L"DllMain", L"Cannot create file", MB_OK);
        return;
    }
 
    bErrorFlag = WriteFile(hFile, DataBuffer, dwBytesToWrite, &dwBytesWritten, NULL);  
 
    if (FALSE == bErrorFlag)
    {
        printf("Terminal failure: Unable to write to file.\n");
                MessageBox(NULL, L"DllMain", L"Terminal failure: Unable to write to file", MB_OK);
    }
 
    CloseHandle(hFile);
};
 
INT APIENTRY DllMain(HMODULE hDll, DWORD Reason, LPVOID Reserved)
{
        MessageBox(NULL, L"DllMain", L"DllMain is LAUNCH", MB_OK);
    printf("DllMain.\n");
    logIt();
    switch (Reason)
    {
    case DLL_PROCESS_ATTACH:
        //fprintf(file, "DLL attach function called.n");
        break;
    case DLL_PROCESS_DETACH:
        //fprintf(file, "DLL detach function called.n");
        break;
    case DLL_THREAD_ATTACH:
        //fprintf(file, "DLL thread attach function called.n");
        break;
    case DLL_THREAD_DETACH:
        //fprintf(file, "DLL thread detach function called.n");
        break;
    }
 
    return TRUE;
}
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
10.09.2015, 11:41
Цитата Сообщение от AdamWest Посмотреть сообщение
Word у меня 2013 версии. А в итоге в чём была Ваша ошибка?
Не имею понятия, о какой ошибке (моей) идет речь. У меня все нормально.
Укажите разрядность Вашего MS Office и версию ОС. Если найду время, попробую на нем.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.09.2015, 11:41

Отслеживание закрытия программы.
Как отследить что мою прогу пытаются закрыть. Неважно как, по CTRL Alt Del, или еще как? CloseQuery не пашет.

Отслеживание закрытия программы
Приветствую! Нужна ваша помощь! Каким образом можно запустить exe файл и ждать его завершения? После его завершения вывести сообщение о...

Отслеживание закрытия диалога
Здравствуйте! Имеется вот такой класс: package com.contedevel.timetable; import java.util.ArrayList; import java.util.List; ...

Отслеживание закрытия стороннего приложения
Всем доброго времени суток. Нужно реализовать программу последовательного открытия .exe файлов. То есть указать 2 пути к файлам. После чего...

Отслеживание закрытия формы javafx
Здравствуйте! Такой вопрос. Есть форма (сцена) приложения и вот из нее по кнопке создаю и запускаю экземпляр дочерней формы (другой). можно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru