Repository navigation
Expand file tree
/
Copy pathmain.cpp
More file actions
70 lines (57 loc) · 1.9 KB
/
Copy pathmain.cpp
File metadata and controls
70 lines (57 loc) · 1.9 KB
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
#include <initguid.h>
#include <windows.h>
#include <iostream>
#include <string>
#include <comdef.h>
#define _WIN32_MSM 200
#include <mergemod.h>
#pragma comment(lib, "ole32.lib")
#pragma comment(lib, "oleaut32.lib")
int main(int argc, char* argv[]) {
if (argc != 3) {
std::cout << "Usage: " << argv[0] << " <msm_file> <output_dir>\n";
return 1;
}
HRESULT hr = CoInitialize(NULL);
if (FAILED(hr)) {
std::cout << "Failed to initialize COM\n";
return 1;
}
try {
IMsmMerge2* merge = nullptr;
hr = CoCreateInstance(CLSID_MsmMerge2, NULL, CLSCTX_INPROC_SERVER, IID_IMsmMerge2, reinterpret_cast<void**>(&merge));
if (FAILED(hr))
throw _com_error(hr);
_bstr_t msmFile(argv[1]);
_bstr_t outputDir(argv[2]);
hr = merge->OpenModule(msmFile, {});
if (FAILED(hr))
throw _com_error(hr);
IMsmStrings* extractedFiles = nullptr;
hr = merge->ExtractFilesEx(outputDir, VARIANT_TRUE, &extractedFiles);
if (SUCCEEDED(hr) && extractedFiles) {
long count = 0;
extractedFiles->get_Count(&count);
std::cout << "Extracted " << count << " files:\n";
for (long i = 0; i < count; i++) {
BSTR fileName = nullptr;
if (SUCCEEDED(extractedFiles->get_Item(i, &fileName))) {
std::wcout << fileName << std::endl;
SysFreeString(fileName);
}
}
extractedFiles->Release();
}
if (FAILED(hr))
throw _com_error(hr);
merge->CloseModule();
merge->Release();
std::cout << "Files extracted successfully to: " << argv[2] << std::endl;
}
catch (const _com_error& e) {
std::wcout << L"Error: " << e.ErrorMessage() << std::endl;
return 1;
}
CoUninitialize();
return 0;
}