Commit efe40a72c503808d1460b16794c4f06dabb691e0

Authored by Perry Werneck
1 parent 1373009b
Exists in master and in 1 other branch develop

Implementing MSVC version.

.gitignore
... ... @@ -25,4 +25,9 @@ doxygen/html
25 25 doxygen/rtf
26 26 *~
27 27 *.pc
  28 +*.obj
  29 +*.dll
  30 +*.exe
  31 +*.exp
  32 +*.lib
28 33  
... ...
README.md
... ... @@ -82,3 +82,26 @@ TODO
82 82 $ make install
83 83 ```
84 84  
  85 +### Windows native with MSVC
  86 +
  87 +1. Install pw3270 with remote control and sdk modules
  88 +
  89 +2. Download and install Visual Studio Build Tools (https://visualstudio.microsoft.com/pt-br/downloads/)
  90 +
  91 +3. Download and install git for windows
  92 +
  93 +4. Build and install the "glue" library using the MSVC Native tools command prompt as administrator.
  94 +
  95 + ```shell
  96 + git clone https://github.com/PerryWerneck/libipc3270.git ./ipc3270
  97 + cd ipc3270
  98 + install.bat
  99 + ```
  100 +
  101 +5. Build and install hllapi library using the MSVC Native tools command prompt as administrator.
  102 +
  103 + ```shell
  104 + git clone https://github.com/PerryWerneck/libhllapi.git ./hllapi
  105 + cd hllapi
  106 + install.bat
  107 + ```
... ...
clean.bat 0 → 100644
... ... @@ -0,0 +1,2 @@
  1 +@echo off
  2 +nmake /f win\Makefile.msc clean
... ...
src/core/windows/init.cc
... ... @@ -36,13 +36,18 @@
36 36 *
37 37 */
38 38  
39   -#ifndef _MSC_VER
40   - #include <config.h>
41   - #pragma comment(lib,"Advapi32.lib")
42   -#endif // !_MSC_VER
43   -
44 39 #include <winsock2.h>
45 40 #include <windows.h>
  41 +
  42 + #ifdef _MSC_VER
  43 + #pragma comment(lib,"Advapi32.lib")
  44 + #pragma comment(lib,"ipc3270.lib")
  45 + #pragma comment(lib,"Delayimp.lib")
  46 + #include <Delayimp.h>
  47 + #else
  48 + #include <config.h>
  49 + #endif // !_MSC_VER
  50 +
46 51 #include "../private.h"
47 52 #include <lmcons.h>
48 53 #include <delayimp.h>
... ... @@ -50,33 +55,52 @@
50 55 #include <string>
51 56 #include <stdexcept>
52 57 #include <lib3270.h>
  58 + #include <lib3270/hllapi.h>
  59 +
  60 + #ifdef HAVE_LIBINTL
  61 + #include <libintl.h>
  62 + #endif // HAVE_LIBINTL
53 63  
54   -#ifdef HAVE_LIBINTL
55   - #include <libintl.h>
56   -#endif // HAVE_LIBINTL
57   -
58   - #ifdef USING_STATIC_IPC3270
  64 + using namespace std;
59 65  
60 66 extern "C" {
61 67  
62   - extern __declspec (dllexport) PfnDliHook __pfnDliNotifyHook2;
63   - extern __declspec (dllexport) PfnDliHook __pfnDliFailureHook2;
  68 + #ifdef _MSC_VER
  69 +
  70 + #pragma comment(linker, "/EXPORT:DllRegisterServer=DllRegisterServer,PRIVATE")
  71 + #pragma comment(linker, "/EXPORT:DllUnregisterServer=DllUnregisterServer,PRIVATE")
  72 + #pragma comment(linker, "/EXPORT:DllInstall=DllInstall,PRIVATE")
  73 +
  74 + extern HRESULT DllRegisterServer();
  75 + extern HRESULT DllInstall(BOOL, PCWSTR);
  76 + extern HRESULT DllUnregisterServer();
  77 +
  78 + #else
64 79  
65 80 extern __declspec (dllexport) HRESULT DllRegisterServer();
66 81 extern __declspec (dllexport) HRESULT DllInstall(BOOL, PCWSTR);
  82 + extern __declspec (dllexport) HRESULT DllUnregisterServer();
  83 +
  84 + #endif // MSC_VER
67 85  
68 86 FARPROC WINAPI hllapi_delay_load_hook(unsigned reason, DelayLoadInfo * info);
69 87  
70 88 }
71 89  
72   - using std::string;
  90 +#ifdef USING_STATIC_IPC3270
73 91  
74   -/*---[ Implement ]----------------------------------------------------------------------------------*/
  92 + // https://docs.microsoft.com/en-us/cpp/build/reference/loading-all-imports-for-a-delay-loaded-dll?view=vs-2019
  93 + #ifdef _MSC_VER
  94 + const PfnDliHook __pfnDliNotifyHook2 = hllapi_delay_load_hook;
  95 + const PfnDliHook __pfnDliFailureHook2 = hllapi_delay_load_hook;
  96 + #else
  97 + PfnDliHook __pfnDliNotifyHook2 = hllapi_delay_load_hook;
  98 + PfnDliHook __pfnDliFailureHook2 = hllapi_delay_load_hook;
  99 + #endif // _MSC_VER
75 100  
76   - // https://docs.microsoft.com/en-us/cpp/build/reference/loading-all-imports-for-a-delay-loaded-dll?view=vs-2019
  101 +#endif // USING_STATIC_IPC3270
77 102  
78   - PfnDliHook __pfnDliNotifyHook2 = hllapi_delay_load_hook;
79   - PfnDliHook __pfnDliFailureHook2 = hllapi_delay_load_hook;
  103 +/*---[ Implement ]----------------------------------------------------------------------------------*/
80 104  
81 105 static HANDLE hModule = 0;
82 106 static HANDLE hEventLog = 0;
... ... @@ -85,6 +109,10 @@
85 109 return S_OK;
86 110 }
87 111  
  112 + HRESULT DllUnregisterServer() {
  113 + return S_OK;
  114 + }
  115 +
88 116 HRESULT DllInstall(BOOL bInstall, PCWSTR pszCmdLine) {
89 117 return S_OK;
90 118 }
... ... @@ -108,39 +136,44 @@
108 136 return TRUE;
109 137 }
110 138  
111   - static void eventlog(const char *msg) {
  139 + HLLAPI_API_CALL hllapi_report_event(LPSTR message) {
112 140  
113   - char username[UNLEN + 1];
114   - DWORD szName = sizeof(username);
  141 + char username[UNLEN + 1];
  142 + DWORD szName = sizeof(username);
115 143  
116   - memset(username,0,UNLEN + 1);
  144 + memset(username,0,UNLEN + 1);
117 145  
118   - if(!GetUserName(username, &szName)) {
119   - username[0] = 0;
120   - }
  146 + if(!GetUserName(username, &szName)) {
  147 + username[0] = 0;
  148 + }
  149 +
  150 + const char *outMsg[] = {
  151 + username,
  152 + PACKAGE_NAME,
  153 + message
  154 + };
  155 +
  156 + debug("Event: \"%s\"",msg);
121 157  
122   - const char *outMsg[] = {
123   - username,
124   - PACKAGE_NAME,
125   - msg
126   - };
127   -
128   - debug("Event: \"%s\"",msg);
129   -
130   - ReportEvent(
131   - hEventLog,
132   - EVENTLOG_ERROR_TYPE,
133   - 1,
134   - 0,
135   - NULL,
136   - 3,
137   - 0,
138   - outMsg,
139   - NULL
140   - );
  158 + ReportEvent(
  159 + hEventLog,
  160 + EVENTLOG_ERROR_TYPE,
  161 + 1,
  162 + 0,
  163 + NULL,
  164 + 3,
  165 + 0,
  166 + outMsg,
  167 + NULL
  168 + );
  169 +
  170 + return HLLAPI_STATUS_SUCCESS;
141 171  
142 172 }
143 173  
  174 +
  175 +#ifdef USING_STATIC_IPC3270
  176 +
144 177 static void dummyProc() {
145 178 throw std::runtime_error(_("Operation not supported"));
146 179 }
... ... @@ -149,6 +182,8 @@
149 182  
150 183 static string savedpath;
151 184  
  185 + printf("%s\n",__FUNCTION__);
  186 +
152 187 // https://docs.microsoft.com/en-us/cpp/build/reference/structure-and-constant-definitions?view=vs-2019
153 188 switch (reason) {
154 189 case dliNoteStartProcessing:
... ... @@ -197,15 +232,16 @@
197 232 {
198 233 string msg = "Can't load ";
199 234 msg += (const char *) info->szDll;
200   - eventlog(msg.c_str());
  235 + hllapi_report_event((LPSTR) msg.c_str());
201 236 }
202   - return (FARPROC) hModule;
  237 + break;
203 238  
204 239 case dliFailGetProc:
205 240 {
  241 + // TODO: Check usage of RaiseException ?
206 242 string msg = "Can't find method on ";
207 243 msg += (const char *) info->szDll;
208   - eventlog(msg.c_str());
  244 + hllapi_report_event((LPSTR) msg.c_str());
209 245 }
210 246 return (FARPROC) dummyProc;
211 247  
... ... @@ -217,5 +253,4 @@
217 253  
218 254 }
219 255  
220   - #endif // USING_STATIC_IPC3270
221   -
  256 +#endif // USING_STATIC_IPC3270
... ...
src/include/lib3270/hllapi.h
... ... @@ -360,6 +360,12 @@
360 360 HLLAPI_API_CALL hllapi_set_cursor_position(WORD row, WORD col);
361 361  
362 362 /**
  363 + * @brief Report event to system log
  364 + *
  365 + */
  366 + HLLAPI_API_CALL hllapi_report_event(LPSTR message);
  367 +
  368 + /**
363 369 * @brief Get cursor address.
364 370 *
365 371 * @return Cursor address.
... ...
src/testprogram/testprogram.cc
... ... @@ -50,6 +50,8 @@
50 50  
51 51 int main(int argc, char **argv) {
52 52  
  53 + printf("******\n");
  54 +
53 55 char buffer[SCREEN_LENGTH+1];
54 56  
55 57 const char *host = "";
... ... @@ -269,7 +271,13 @@
269 271 cout.flush();
270 272 }
271 273  
272   - /*
  274 + rc = hllapi_deinit();
  275 + cout << "hllapi_deinit exits with rc=" << rc << endl;
  276 +
  277 + return 0;
  278 + }
  279 +
  280 + /*
273 281  
274 282  
275 283 rc = hllapi_wait_for_ready(10);
... ... @@ -314,9 +322,4 @@
314 322  
315 323 */
316 324  
317   - rc = hllapi_deinit();
318   - cout << "hllapi_deinit exits with rc=" << rc << endl;
319   -
320   - return 0;
321   - }
322 325  
... ...
win/Makefile.msc
... ... @@ -47,6 +47,7 @@ OBJ_FILES= \
47 47 /DPRODUCT_NAME=$(PRODUCT_NAME) \
48 48 /DLIB3270_NAME=$(LIB3270_NAME) \
49 49 /DNDEBUG=1 \
  50 + /DUSING_STATIC_IPC3270 \
50 51 /I".\src\include" \
51 52 /I"$(PW3270_SDK_PATH)\include" \
52 53 /EHsc \
... ... @@ -60,6 +61,7 @@ testprogram.exe: \
60 61 @link \
61 62 /nologo \
62 63 /OUT:"$@" \
  64 + /LIBPATH:. \
63 65 /LIBPATH:"$(PW3270_SDK_PATH)\lib" \
64 66 src\testprogram\testprogram.obj
65 67  
... ... @@ -72,11 +74,11 @@ hllapi.dll: \
72 74 /OUT:"$@" \
73 75 /LIBPATH:"$(PW3270_SDK_PATH)\lib" \
74 76 $(OBJ_FILES) \
75   - "ipc3270.lib \
76   - Advapi32.lib
  77 + /DELAYLOAD:$(LIB3270_NAME).dll
  78 +
77 79  
78 80 install: \
79   - $(OBJ_FILES)
  81 + hllapi.dll
80 82 @echo Building library...
81 83 @-mkdir "$(PW3270_SDK_PATH)\lib"
82 84 @lib \
... ... @@ -86,6 +88,7 @@ install: \
86 88  
87 89 @-mkdir "$(PW3270_SDK_PATH)\include\lib3270"
88 90 @copy "src\include\lib3270\*.h" "$(PW3270_SDK_PATH)\include\lib3270"
  91 + @copy hllapi.dll "$(SystemRoot)\system32"
89 92  
90 93 clean:
91 94 del \
... ...