Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- library Project1;
- uses
- System.SysUtils,
- System.Classes;
- type
- IStringFunctions = interface
- ['{240B567B-E619-48E4-8CDA-F6A722F44A71}']
- function GetMethodValueAsString():PAnsiChar; stdcall;
- end;
- TStringFunctions = class(TInterfacedObject, IStringFunctions)
- public
- function GetMethodValueAsString():PAnsiChar; stdcall;
- end;
- {$R *.res}
- function TStringFunctions.GetMethodValueAsString():PAnsiChar; stdcall;
- begin
- Result := 'test';
- end;
- procedure GetImplementation(out instance:IStringFunctions); stdcall; export;
- begin
- instance := TStringFunctions.Create;
- end;
- exports GetImplementation;
- begin
- end.
- using System;
- using System.Runtime.CompilerServices;
- using System.Runtime.InteropServices;
- namespace ConsoleApplication1
- {
- [ComVisible(true)]
- [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("240B567B-E619-48E4-8CDA-F6A722F44A71")]
- public interface IStringFunctions
- {
- [MethodImplAttribute(MethodImplOptions.PreserveSig)]
- [return: MarshalAs(UnmanagedType.AnsiBStr)]
- string GetMethodValueAsString();
- }
- class Program
- {
- [DllImport("kernel32.dll", EntryPoint = "LoadLibrary", CallingConvention = CallingConvention.StdCall)]
- static extern int LoadLibrary([MarshalAs(UnmanagedType.LPStr)] string lpLibFileName);
- [DllImport("kernel32.dll", EntryPoint = "GetProcAddress", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
- static extern IntPtr GetProcAddress(int hModule, [MarshalAs(UnmanagedType.LPStr)] string lpProcName);
- [DllImport("kernel32.dll", EntryPoint = "FreeLibrary", CallingConvention = CallingConvention.StdCall)]
- static extern bool FreeLibrary(int hModule);
- [UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Ansi)]
- delegate void GetImplementation([MarshalAs(UnmanagedType.Interface)] out IStringFunctions instance);
- static void Main(string[] args)
- {
- const string dllName = "Project1.dll";
- const string functionName = "GetImplementation";
- int libHandle = LoadLibrary(dllName);
- if (libHandle == 0) throw new Exception(string.Format("Could not load library "{0}"", dllName));
- var delphiFunctionAddress = GetProcAddress(libHandle, functionName);
- if (delphiFunctionAddress == IntPtr.Zero) throw new Exception(string.Format("Can't find function "{0}" in library "{1}"", functionName, dllName));
- GetImplementation getImplementation = (GetImplementation)Marshal.GetDelegateForFunctionPointer(delphiFunctionAddress, typeof(GetImplementation));
- if (getImplementation != null)
- {
- IStringFunctions instance = null;
- getImplementation(out instance);
- if (instance != null)
- {
- //!!! don't return value !!!!
- String result = instance.GetMethodValueAsString();
- Console.WriteLine(result);
- }
- }
- Console.ReadLine();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement