diff --git a/configure.ac b/configure.ac
index 6560f26..2e4064f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -101,7 +101,7 @@ case "$host" in
CFLAGS="$CFLAGS -pthread -D_WIN32_WINNT=0x0600"
CXXFLAGS="$CXXFLAGS -pthread -D_WIN32_WINNT=0x0600"
LIBS="$LIBS -lws2_32 -lwtsapi32 -lcomdlg32"
- LDFLAGS="$LDFLAGS -static-libgcc -static-libstdc++ -Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive,-Bdynamic"
+ LDFLAGS="$LDFLAGS -static-libgcc -static-libstdc++"
DLLEXT=".dll"
app_win32_revision=$(date +%-y.%-m.%-d.%-H)
@@ -184,6 +184,7 @@ AC_ARG_WITH([static-ipc3270],
if test "$app_cv_static_ipc3270" == "yes"; then
PKG_CHECK_MODULES( [IPC3270], [ipc3270-static], AC_DEFINE(USING_STATIC_IPC3270), AC_MSG_ERROR([IPC3270 not present.]))
else
+ LDFLAGS="$LDFLAGS -Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive,-Bdynamic"
PKG_CHECK_MODULES( [IPC3270], [ipc3270], AC_DEFINE(USING_SHARED_IPC3270), AC_MSG_ERROR([IPC3270 not present.]))
fi
diff --git a/py3270.cbp b/py3270.cbp
index f16bfed..e47a66f 100644
--- a/py3270.cbp
+++ b/py3270.cbp
@@ -56,6 +56,8 @@
+
+
diff --git a/src/include/py3270.h b/src/include/py3270.h
index c33817f..48b1aa4 100644
--- a/src/include/py3270.h
+++ b/src/include/py3270.h
@@ -77,12 +77,14 @@
#include
#include
#include
+ #include
#include
#include
#include
using std::exception;
using std::runtime_error;
+ using std::string;
using TN3270::Host;
using TN3270::Action;
@@ -93,6 +95,8 @@
DLL_PRIVATE void py3270_wait(Host &host, PyObject *args);
+ DLL_PRIVATE string py3270_get_datadir() noexcept;
+
extern "C" {
#else
@@ -163,38 +167,6 @@
DLL_PRIVATE PyObject * py3270_action_get_activatable(PyObject *self, void *dunno);
DLL_PRIVATE PyObject * py3270_action_str(PyObject *self);
- /*
-
- DLL_PRIVATE PyObject * py3270_alloc(PyTypeObject *type, PyObject *args, PyObject *kwds);
- DLL_PRIVATE int py3270_init(py3270_TerminalObject *self, PyObject *args, PyObject *kwds);
- DLL_PRIVATE void py3270_dealloc(py3270_TerminalObject * self);
-
- DLL_PRIVATE PyObject * terminal_get_version(PyObject *self, PyObject *args);
- DLL_PRIVATE PyObject * terminal_get_revision(PyObject *self, PyObject *args);
-
- DLL_PRIVATE PyObject * terminal_is_connected(PyObject *self, PyObject *args);
- DLL_PRIVATE PyObject * terminal_is_ready(PyObject *self, PyObject *args);
-
- DLL_PRIVATE PyObject * terminal_connect(PyObject *self, PyObject *args);
- DLL_PRIVATE PyObject * terminal_disconnect(PyObject *self, PyObject *args);
-
- DLL_PRIVATE PyObject * terminal_get_string_at(PyObject *self, PyObject *args);
- DLL_PRIVATE PyObject * terminal_get_contents(PyObject *self);
- DLL_PRIVATE PyObject * terminal_set_string_at(PyObject *self, PyObject *args);
- DLL_PRIVATE PyObject * terminal_cmp_string_at(PyObject *self, PyObject *args);
-
- DLL_PRIVATE PyObject * terminal_pfkey(PyObject *self, PyObject *args);
- DLL_PRIVATE PyObject * terminal_pakey(PyObject *self, PyObject *args);
- DLL_PRIVATE PyObject * terminal_enter(PyObject *self, PyObject *args);
- DLL_PRIVATE PyObject * terminal_action(PyObject *self, PyObject *args);
-
- DLL_PRIVATE PyObject * terminal_is_protected_at(PyObject *self, PyObject *args);
- DLL_PRIVATE PyObject * terminal_set_cursor_at(PyObject *self, PyObject *args);
-
- DLL_PRIVATE PyObject * terminal_wait_for_ready(PyObject *self, PyObject *args);
- DLL_PRIVATE PyObject * terminal_wait_for_string_at(PyObject *self, PyObject *args);
- */
-
#ifdef __cplusplus
}
#endif
diff --git a/src/module/windows/init.cc b/src/module/windows/init.cc
new file mode 100644
index 0000000..00cfae1
--- /dev/null
+++ b/src/module/windows/init.cc
@@ -0,0 +1,195 @@
+/*
+ * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270
+ * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a
+ * aplicativos mainframe. Registro no INPI sob o nome G3270.
+ *
+ * Copyright (C) <2008>
+ *
+ * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob
+ * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela
+ * Free Software Foundation.
+ *
+ * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
+ * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
+ * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
+ * obter mais detalhes.
+ *
+ * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
+ * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin
+ * St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Este programa está nomeado como - e possui - linhas de código.
+ *
+ * Contatos:
+ *
+ * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
+ * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
+ *
+ */
+
+/**
+ * @file
+ *
+ * @brief Win32 delayed loading support methods.
+ *
+ * @author perry.werneck@gmail.com
+ *
+ */
+
+ #include
+ #include
+ #include
+ #include
+ #include
+ #include
+ #include
+ #include
+ #include
+ #include
+
+ #ifdef USING_STATIC_IPC3270
+
+ extern "C" {
+
+ extern __declspec (dllexport) PfnDliHook __pfnDliNotifyHook2;
+ extern __declspec (dllexport) PfnDliHook __pfnDliFailureHook2;
+
+ FARPROC WINAPI py3270_delay_load_hook(unsigned reason, DelayLoadInfo * info);
+
+ }
+
+ using std::string;
+
+/*---[ Implement ]----------------------------------------------------------------------------------*/
+
+ // https://docs.microsoft.com/en-us/cpp/build/reference/loading-all-imports-for-a-delay-loaded-dll?view=vs-2019
+
+ PfnDliHook __pfnDliNotifyHook2 = py3270_delay_load_hook;
+ PfnDliHook __pfnDliFailureHook2 = py3270_delay_load_hook;
+
+ static HANDLE hModule = 0;
+ static HANDLE hEventLog = 0;
+
+ BOOL WINAPI DllMain(HANDLE hInstance, DWORD dwcallpurpose, LPVOID lpvResvd) {
+ switch(dwcallpurpose) {
+ case DLL_PROCESS_ATTACH:
+ hModule = hInstance;
+ hEventLog = RegisterEventSource(NULL, LIB3270_STRINGIZE_VALUE_OF(PRODUCT_NAME));
+ break;
+
+ case DLL_PROCESS_DETACH:
+ hModule = 0;
+ DeregisterEventSource(hEventLog);
+ hEventLog = 0;
+ break;
+
+ }
+
+ return TRUE;
+ }
+
+ static void eventlog(const char *msg) {
+
+ char username[UNLEN + 1];
+ DWORD szName = sizeof(username);
+
+ memset(username,0,UNLEN + 1);
+
+ if(!GetUserName(username, &szName)) {
+ username[0] = 0;
+ }
+
+ const char *outMsg[] = {
+ username,
+ PACKAGE_NAME,
+ msg
+ };
+
+ debug("Event: \"%s\"",msg);
+
+ ReportEvent(
+ hEventLog,
+ EVENTLOG_ERROR_TYPE,
+ 1,
+ 0,
+ NULL,
+ 3,
+ 0,
+ outMsg,
+ NULL
+ );
+
+ }
+
+ static void dummyProc() {
+ throw std::runtime_error("Operation not supported");
+ }
+
+ FARPROC WINAPI py3270_delay_load_hook(unsigned reason, DelayLoadInfo * info) {
+
+ static string savedpath;
+
+ // https://docs.microsoft.com/en-us/cpp/build/reference/structure-and-constant-definitions?view=vs-2019
+ switch (reason) {
+ case dliNoteStartProcessing:
+ {
+
+ string datadir = py3270_get_datadir();
+
+ if(!datadir.empty()) {
+
+ char curdir[4096];
+ memset(curdir,0,sizeof(curdir));
+
+ if(GetCurrentDirectory(sizeof(curdir)-1,curdir)) {
+ savedpath = curdir;
+ } else {
+ savedpath.clear();
+ }
+
+ SetCurrentDirectory(datadir.c_str());
+
+ }
+
+ }
+ break;
+
+ case dliNoteEndProcessing:
+ if(!savedpath.empty()) {
+ SetCurrentDirectory(savedpath.c_str());
+ savedpath.clear();
+ }
+ break;
+
+ case dliNotePreLoadLibrary:
+ break;
+
+ case dliNotePreGetProcAddress:
+ break;
+
+ case dliFailLoadLib:
+ {
+ string msg = "Can't load ";
+ msg += (const char *) info->szDll;
+ eventlog(msg.c_str());
+ }
+ return (FARPROC) hModule;
+
+ case dliFailGetProc:
+ {
+ string msg = "Can't find method on ";
+ msg += (const char *) info->szDll;
+ eventlog(msg.c_str());
+ }
+ return (FARPROC) dummyProc;
+
+ }
+
+ // Returning NULL causes the delay load machinery to perform default
+ // processing for this notification.
+ return NULL;
+
+ }
+
+ #endif // USING_STATIC_IPC3270
+
diff --git a/src/module/windows/tools.cc b/src/module/windows/tools.cc
new file mode 100644
index 0000000..3f290d9
--- /dev/null
+++ b/src/module/windows/tools.cc
@@ -0,0 +1,77 @@
+/*
+ * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270
+ * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a
+ * aplicativos mainframe. Registro no INPI sob o nome G3270.
+ *
+ * Copyright (C) <2008>
+ *
+ * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob
+ * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela
+ * Free Software Foundation.
+ *
+ * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
+ * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
+ * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
+ * obter mais detalhes.
+ *
+ * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
+ * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple
+ * Place, Suite 330, Boston, MA, 02111-1307, USA
+ *
+ * Este programa está nomeado como - e possui - linhas de código.
+ *
+ * Contatos:
+ *
+ * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
+ * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
+ *
+ */
+
+ #include
+
+/*--[ Implement ]------------------------------------------------------------------------------------*/
+
+ std::string py3270_get_datadir() noexcept {
+
+ LSTATUS rc;
+ HKEY hKey = 0;
+ char datadir[4096];
+
+ static const char * keys[] = {
+
+ "Software\\" LIB3270_STRINGIZE_VALUE_OF(PRODUCT_NAME),
+ "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\" LIB3270_STRINGIZE_VALUE_OF(PRODUCT_NAME),
+
+#ifdef LIB3270_NAME
+ "Software\\" LIB3270_STRINGIZE_VALUE_OF(LIB3270_NAME),
+ "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\" LIB3270_STRINGIZE_VALUE_OF(LIB3270_NAME),
+#endif
+
+ "Software\\pw3270",
+ "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\pw3270"
+ };
+
+ for(size_t ix = 0; !*datadir && ix < (sizeof(keys)/sizeof(keys[0])); ix++) {
+
+ rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE,keys[ix],0,KEY_QUERY_VALUE,&hKey);
+ if(rc == ERROR_SUCCESS) {
+
+ unsigned long datatype; // #defined in winnt.h (predefined types 0-11)
+ unsigned long datalen = sizeof(datadir);
+
+ memset(datadir,0,datalen);
+
+ rc = RegQueryValueExA(hKey,"InstallLocation",NULL,&datatype,(LPBYTE) datadir,&datalen);
+ if(rc != ERROR_SUCCESS) {
+ *datadir = 0; // Just in case
+ }
+
+ RegCloseKey(hKey);
+
+ }
+
+ }
+
+ return string(datadir);
+ }
+
--
libgit2 0.21.2