summaryrefslogtreecommitdiff
path: root/Contrib/Library/LibraryLocal/LibraryLocal.cpp
blob: ecdb53cac60136c0ef50029fcd0f6455ae2d4f44 (plain)
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
/*

  LibraryLocal - used by the Library.nsh macros
  Get the version of local DLL and TLB files
  Written by Joost Verburg

*/

#include "../../../Source/Platform.h"

#include <stdio.h>
#include <iostream>
#include <fstream>

#include "../../../Source/util.h"
#include "../../../Source/winchar.h"

using namespace std;

int g_noconfig=0;
int g_display_errors=1;
FILE *g_output=stdout;

int GetTLBVersion(string& filepath, DWORD& high, DWORD & low)
{
#ifdef _WIN32

  int found = 0;

  char fullpath[1024];
  char *p;
  if (!GetFullPathName(filepath.c_str(), sizeof(fullpath), fullpath, &p))
    return 0;

  wchar_t ole_filename[1024];
  MultiByteToWideChar(CP_ACP, 0, fullpath, lstrlen(fullpath) + 1, ole_filename, 1024);
  
  ITypeLib* typeLib;
  HRESULT hr;
  
  hr = LoadTypeLib(ole_filename, &typeLib);
  
  if (SUCCEEDED(hr)) {

    TLIBATTR* typelibAttr;
    
    hr = typeLib->GetLibAttr(&typelibAttr);

    if (SUCCEEDED(hr)) {
      
      high = typelibAttr->wMajorVerNum;
      low = typelibAttr->wMinorVerNum;
      
      found = 1;

    }

    typeLib->Release();

  }

  return found;

#else

  return 0;

#endif
}

int main(int argc, char* argv[])
{

  // Parse the command line

  string cmdline;

  string mode;
  string filename;
  string filepath;

  int filefound = 0;

  if (argc != 4)
    return 1;

  // Get the full path of the local file

  mode = argv[1];
  filename = argv[2];

  // Validate filename

  ifstream fs(filename.c_str());
  
  if (fs.is_open())
  {
    filefound = 1;
    fs.close();
  }

  // Work
  
  int versionfound = 0;
  DWORD low = 0, high = 0;

  if (filefound)
  {

    // Get version
    
    // DLL
    
    if (mode.compare("D") == 0)
    {
      
      versionfound = GetDLLVersion(filename, high, low);

    }

    // TLB
    
    if (mode.compare("T") == 0)
    {
      
      versionfound = GetTLBVersion(filename, high, low);

    }

  }

  // Write the version to an NSIS header file

  ofstream header(argv[3], ofstream::out);
  
  if (header)
  {

    if (!filefound)
    {
      header << "!define LIBRARY_VERSION_FILENOTFOUND" << endl;
    }
    else if (!versionfound)
    {
      header << "!define LIBRARY_VERSION_NONE" << endl;
    }
    else
    {
      header << "!define LIBRARY_VERSION_HIGH " << high << endl;
      header << "!define LIBRARY_VERSION_LOW " << low << endl;
    }
    
    header.close();

  }

  return 0;

}