From 5fae0df2f6b4a2e239839aa8b6ff894821750059 Mon Sep 17 00:00:00 2001 From: Felipe Zorzo Date: Wed, 3 Jan 2024 13:06:19 -0300 Subject: [PATCH] feat: Remove preprocessor directives from NativeMethods class and load the correct dll according the architecture (Forms 6i for 32-bit process and Forms 12c for 64-bit process) --- Ndapi/Core/NativeMethods.6.cs | 116 ++++++++++++++++++++++++++++++++++ Ndapi/Core/NativeMethods.cs | 61 +++--------------- Ndapi/NdapiContext.cs | 21 +++++- 3 files changed, 145 insertions(+), 53 deletions(-) create mode 100644 Ndapi/Core/NativeMethods.6.cs diff --git a/Ndapi/Core/NativeMethods.6.cs b/Ndapi/Core/NativeMethods.6.cs new file mode 100644 index 0000000..1a0c33b --- /dev/null +++ b/Ndapi/Core/NativeMethods.6.cs @@ -0,0 +1,116 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +using Ndapi.Core.Handles; +using Ndapi.Enums; + +namespace Ndapi.Core; + +internal static partial class NativeMethods +{ + // Methods exclusive to Forms 6i + + #region Attached library methods + + [LibraryImport(forms6Lib)] + [UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])] + public static partial D2fErrorCode d2falbat_Attach(ContextSafeHandle pd2fctx, + ObjectSafeHandle parent, + out ObjectSafeHandle ppd2falb, + [MarshalAs(UnmanagedType.I1)] bool db, + [MarshalAs(UnmanagedType.LPStr)] string name); + + #endregion + + #region Form module methods + + [LibraryImport(forms6Lib)] + [UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])] + public static partial D2fErrorCode d2ffmdld_Load(ContextSafeHandle pd2fctx, + out ObjectSafeHandle ppd2ffmd, + [MarshalAs(UnmanagedType.LPStr)] string formname, + [MarshalAs(UnmanagedType.I1)] bool db); + + [LibraryImport(forms6Lib)] + [UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])] + public static partial D2fErrorCode d2ffmdsv_Save(ContextSafeHandle pd2fctx, + ObjectSafeHandle pd2ffmd, + [MarshalAs(UnmanagedType.LPStr)] string formname, + [MarshalAs(UnmanagedType.I1)] bool db); + + [LibraryImport(forms6Lib)] + [UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])] + public static partial D2fErrorCode d2ffmdfv_FileVersion(ContextSafeHandle pd2fctx, + [MarshalAs(UnmanagedType.LPStr)] string formname, + [MarshalAs(UnmanagedType.I1)] bool db, + out int version); + + #endregion + + #region Object library methods + + // Forms 6i only + [LibraryImport(forms6Lib)] + [UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])] + public static partial D2fErrorCode d2folbld_Load(ContextSafeHandle pd2fctx, + out ObjectSafeHandle ppd2folb, + [MarshalAs(UnmanagedType.LPStr)] string olibname, + [MarshalAs(UnmanagedType.I1)] bool db); + + [LibraryImport(forms6Lib)] + [UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])] + public static partial D2fErrorCode d2folbsv_Save(ContextSafeHandle pd2fctx, + ObjectSafeHandle pd2folb, + [MarshalAs(UnmanagedType.LPStr)] string olibname, + [MarshalAs(UnmanagedType.I1)] bool db); + + #endregion + + #region Object library tab methods + + [LibraryImport(forms6Lib)] + [UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])] + public static partial D2fErrorCode d2folbfv_FileVersion(ContextSafeHandle pd2fctx, + [MarshalAs(UnmanagedType.LPStr)] string olibname, + [MarshalAs(UnmanagedType.I1)] bool db, + out int version); + + #endregion + + #region Menu module methods + + [LibraryImport(forms6Lib)] + [UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])] + public static partial D2fErrorCode d2fmmdld_Load(ContextSafeHandle pd2fctx, + out ObjectSafeHandle ppd2fmmd, + [MarshalAs(UnmanagedType.LPStr)] string formname, + [MarshalAs(UnmanagedType.I1)] bool db); + + [LibraryImport(forms6Lib)] + [UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])] + public static partial D2fErrorCode d2fmmdsv_Save(ContextSafeHandle pd2fctx, + ObjectSafeHandle pd2fmmd, + [MarshalAs(UnmanagedType.LPStr)] string menuname, + [MarshalAs(UnmanagedType.I1)] bool db); + + [LibraryImport(forms6Lib)] + [UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])] + public static partial D2fErrorCode d2fmmdfv_FileVersion(ContextSafeHandle pd2fctx, + [MarshalAs(UnmanagedType.LPStr)] string menuname, + [MarshalAs(UnmanagedType.I1)] bool db, + out int version); + + #endregion + + #region Library module methods + + [LibraryImport(forms6Lib)] + [UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])] + public static partial D2fErrorCode d2flibld_Load(ContextSafeHandle pd2fctx, + out ObjectSafeHandle ppd2flib, + [MarshalAs(UnmanagedType.LPStr)] string libname, + [MarshalAs(UnmanagedType.I1)] bool db); + + #endregion + +} diff --git a/Ndapi/Core/NativeMethods.cs b/Ndapi/Core/NativeMethods.cs index 1fab1a6..207f15f 100644 --- a/Ndapi/Core/NativeMethods.cs +++ b/Ndapi/Core/NativeMethods.cs @@ -10,11 +10,8 @@ namespace Ndapi.Core; internal static partial class NativeMethods { -#if FORMS_6 - internal const string formsLib = "ifd2f60.dll"; -#else - internal const string formsLib = "frmd2f.dll"; -#endif + internal const string forms6Lib = "ifd2f60"; + internal const string formsLib = "frmd2f"; #region Context methods @@ -58,9 +55,6 @@ internal static partial class NativeMethods public static partial D2fErrorCode d2falbat_Attach(ContextSafeHandle pd2fctx, ObjectSafeHandle parent, out ObjectSafeHandle ppd2falb, -#if FORMS_6 - [MarshalAs(UnmanagedType.I1)] bool db, -#endif [MarshalAs(UnmanagedType.LPStr)] string name); [LibraryImport(formsLib)] @@ -119,21 +113,13 @@ internal static partial class NativeMethods [UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])] public static partial D2fErrorCode d2ffmdld_Load(ContextSafeHandle pd2fctx, out ObjectSafeHandle ppd2ffmd, - [MarshalAs(UnmanagedType.LPStr)] string formname -#if FORMS_6 - , [MarshalAs(UnmanagedType.I1)] bool db -#endif - ); + [MarshalAs(UnmanagedType.LPStr)] string formname); [LibraryImport(formsLib)] [UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])] public static partial D2fErrorCode d2ffmdsv_Save(ContextSafeHandle pd2fctx, ObjectSafeHandle pd2ffmd, - [MarshalAs(UnmanagedType.LPStr)] string formname -#if FORMS_6 - , [MarshalAs(UnmanagedType.I1)] bool db -#endif - ); + [MarshalAs(UnmanagedType.LPStr)] string formname); [LibraryImport(formsLib)] [UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])] @@ -147,9 +133,6 @@ internal static partial class NativeMethods [UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])] public static partial D2fErrorCode d2ffmdfv_FileVersion(ContextSafeHandle pd2fctx, [MarshalAs(UnmanagedType.LPStr)] string formname, -#if FORMS_6 - [MarshalAs(UnmanagedType.I1)] bool db, -#endif out int version); #endregion @@ -160,21 +143,13 @@ internal static partial class NativeMethods [UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])] public static partial D2fErrorCode d2folbld_Load(ContextSafeHandle pd2fctx, out ObjectSafeHandle ppd2folb, - [MarshalAs(UnmanagedType.LPStr)] string olibname -#if FORMS_6 - , [MarshalAs(UnmanagedType.I1)] bool db -#endif - ); + [MarshalAs(UnmanagedType.LPStr)] string olibname); [LibraryImport(formsLib)] [UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])] public static partial D2fErrorCode d2folbsv_Save(ContextSafeHandle pd2fctx, ObjectSafeHandle pd2folb, - [MarshalAs(UnmanagedType.LPStr)] string olibname -#if FORMS_6 - , [MarshalAs(UnmanagedType.I1)] bool db -#endif - ); + [MarshalAs(UnmanagedType.LPStr)] string olibname); [LibraryImport(formsLib)] [UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])] @@ -236,9 +211,6 @@ internal static partial class NativeMethods [UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])] public static partial D2fErrorCode d2folbfv_FileVersion(ContextSafeHandle pd2fctx, [MarshalAs(UnmanagedType.LPStr)] string olibname, -#if FORMS_6 - [MarshalAs(UnmanagedType.I1)] bool db, -#endif out int version); #endregion @@ -249,21 +221,13 @@ internal static partial class NativeMethods [UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])] public static partial D2fErrorCode d2fmmdld_Load(ContextSafeHandle pd2fctx, out ObjectSafeHandle ppd2fmmd, - [MarshalAs(UnmanagedType.LPStr)] string formname -#if FORMS_6 - , [MarshalAs(UnmanagedType.I1)] bool db -#endif - ); + [MarshalAs(UnmanagedType.LPStr)] string formname); [LibraryImport(formsLib)] [UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])] public static partial D2fErrorCode d2fmmdsv_Save(ContextSafeHandle pd2fctx, ObjectSafeHandle pd2fmmd, - [MarshalAs(UnmanagedType.LPStr)] string menuname -#if FORMS_6 - , [MarshalAs(UnmanagedType.I1)] bool db -#endif - ); + [MarshalAs(UnmanagedType.LPStr)] string menuname); [LibraryImport(formsLib)] [UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])] @@ -277,9 +241,6 @@ internal static partial class NativeMethods [UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])] public static partial D2fErrorCode d2fmmdfv_FileVersion(ContextSafeHandle pd2fctx, [MarshalAs(UnmanagedType.LPStr)] string menuname, -#if FORMS_6 - [MarshalAs(UnmanagedType.I1)] bool db, -#endif out int version); [LibraryImport(formsLib)] @@ -347,11 +308,7 @@ internal static partial class NativeMethods [UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])] public static partial D2fErrorCode d2flibld_Load(ContextSafeHandle pd2fctx, out ObjectSafeHandle ppd2flib, - [MarshalAs(UnmanagedType.LPStr)] string libname -#if FORMS_6 - , [MarshalAs(UnmanagedType.I1)] bool db -#endif - ); + [MarshalAs(UnmanagedType.LPStr)] string libname); #endregion diff --git a/Ndapi/NdapiContext.cs b/Ndapi/NdapiContext.cs index 546f8e5..d694d74 100644 --- a/Ndapi/NdapiContext.cs +++ b/Ndapi/NdapiContext.cs @@ -23,6 +23,7 @@ public sealed class NdapiContext : IDisposable private static readonly List _modules = []; private static ContextSafeHandle _context; + private static string formsLib; /// /// If true, the module loading will not fail when a required library module is not in the @@ -41,6 +42,24 @@ public sealed class NdapiContext : IDisposable /// public static bool IsConnected { get; private set; } + static NdapiContext() + { + formsLib = NativeMethods.formsLib; + if (!Environment.Is64BitProcess) + { + NativeLibrary.SetDllImportResolver(typeof(NdapiContext).Assembly, ((name, assembly, path) => + { + if (name != NativeMethods.formsLib) + { + return IntPtr.Zero; + } + + formsLib = NativeMethods.forms6Lib; + return NativeLibrary.Load(formsLib, assembly, path); + })); + } + } + internal static ContextSafeHandle GetContext() { if (_context != null) @@ -63,7 +82,7 @@ internal static ContextSafeHandle GetContext() } catch (DllNotFoundException) { - throw new NdapiException($"Could not found the {NativeMethods.formsLib} from Oracle Forms installation. " + + throw new NdapiException($"Could not found the {formsLib} from Oracle Forms installation. " + "Please check if this version of Oracle Forms is installed."); } Ensure.Success(status);