I am adding here the source code of the "relay" that allow me to run the VC++ 64 bits plugin. You must compile that with Embarcadero C++ Builder as a 64 bits DLL - you may use the 30 days demo for that.
Just update the _libmain function (equivalent for Embarcadero of the DllMain on VC++) to set the name of your DLL into it. In the code the name below is "YourPlugInName.dll.relay" (.relay to avoid PLSQL Developer to try to load it, for now)
Second note, if you need to deploy it you will need the following DLL from Embarcadero (part of the "redist" stuff: borlndmm.dll, cc64230.dll, cc64230mt.dll. drop them in the PL/SQL Developer folder, that work.
//RelayDLLPCH1.h
#ifdef _WIN32
#include
#endif
-----
// RelayDLL.cpp
// Important note about DLL memory management when your DLL uses the
// static version of the RunTime Library:
//
// If your DLL exports any functions that pass String objects (or structs/
// classes containing nested Strings) as parameter or function results,
// you will need to add the library MEMMGR.LIB to both the DLL project and
// any other projects that use the DLL. You will also need to use MEMMGR.LIB
// if any other projects which use the DLL will be performing new or delete
// operations on any non-TObject-derived classes which are exported from the
// DLL. Adding MEMMGR.LIB to your project will change the DLL and its calling
// EXE's to use the BORLNDMM.DLL as their memory manager. In these cases,
// the file BORLNDMM.DLL should be deployed along with your DLL.
//
// To avoid using BORLNDMM.DLL, pass string information using "char *" or
// ShortString parameters.
//
// If your DLL uses the dynamic version of the RTL, you do not need to
// explicitly add MEMMGR.LIB as this will be done implicitly for you
#pragma hdrstop
#pragma argsused
#include
HMODULE hm;
// Pointer to all functions I should be able to call from relayed DLL
typedef void (*RegisterCallbackPtr)(int, void*);
typedef char* (*IdentifyPlugInPtr)(int);
typedef void (*OnCreatePtr)();
typedef void (*OnActivatePtr)();
typedef void (*OnDeactivatePtr)();
typedef void (*OnDestroyPtr)();
typedef BOOL (*CanClosePtr)();
typedef char* (*CreateMenuItemPtr)(int);
typedef void (*OnMenuClickPtr)(int);
typedef void (*OnBrowserChangePtr)();
typedef void (*OnWindowChangePtr)();
typedef void (*OnConnectionChangePtr)();
typedef int (*OnWindowClosePtr)(int, BOOL);
typedef void (*OnWindowCreatePtr)(int);
typedef void (*ConfigurePtr)();
typedef void (*OnPopupPtr)(char *, char *);
typedef void (*OnMainMenuPtr)(char *);
typedef char* (*AboutPtr)();
typedef BOOL (*OnTemplatePtr)(char *, char **);
typedef char* (*PlugInNamePtr)();
typedef char* (*PlugInSubNamePtr)();
typedef char* (*PlugInShortNamePtr)();
typedef char* (*RegisterFileSystemPtr)();
typedef char* (*DirectFileLoadPtr)(char *, char *, int );
typedef BOOL (*DirectFileSavePtr)(char *, char *, int );
typedef char* (*RegisterExportPtr)();
typedef void (*ExportInitPtr)();
typedef void (*ExportFinishedPtr)();
typedef void (*ExportPreparePtr)();
typedef void (*ExportDataPtr)();
// And poiters to each of them.
RegisterCallbackPtr RegistercallbackFct;
IdentifyPlugInPtr IdentifyPlugInFct;
OnCreatePtr OnCreateFct;
OnActivatePtr OnActivateFct;
OnDeactivatePtr OnDeactivateFct;
OnDestroyPtr OnDestroyFct;
CanClosePtr CanCloseFct;
CreateMenuItemPtr CreateMenuItemFct;
OnMenuClickPtr OnMenuClickFct;
OnBrowserChangePtr OnBrowserChangeFct;
OnWindowChangePtr OnWindowChangeFct;
OnConnectionChangePtr OnConnectionChangeFct;
OnWindowClosePtr OnWindowCloseFct;
OnWindowCreatePtr OnWindowCreateFct;
ConfigurePtr ConfigureFct;
OnPopupPtr OnPopupFct;
OnMainMenuPtr OnMainMenuFct;
AboutPtr AboutFct;
OnTemplatePtr OnTemplateFct;
PlugInNamePtr PlugInNameFct;
PlugInSubNamePtr PlugInSubNameFct;
PlugInShortNamePtr PlugInShortNameFct;
RegisterFileSystemPtr RegisterFileSystemFct;
DirectFileLoadPtr DirectFileLoadFct;
DirectFileSavePtr DirectFileSaveFct;
RegisterExportPtr RegisterExportFct;
ExportInitPtr ExportInitFct;
ExportFinishedPtr ExportFinishedFct;
ExportPreparePtr ExportPrepareFct;
ExportDataPtr ExportDataFct;
//Functions to export to PL/SQL Dev
extern "C"
{
__declspec(dllexport) void RegisterCallback(int nIndex, void *pvAddr);
__declspec(dllexport) char* IdentifyPlugIn(int);
__declspec(dllexport) void OnCreate();
__declspec(dllexport) void OnActivate();
__declspec(dllexport) void OnDeactivate();
__declspec(dllexport) void OnDestroy();
__declspec(dllexport) BOOL CanClose();
__declspec(dllexport) char* CreateMenuItem(int);
__declspec(dllexport) void OnMenuClick(int);
__declspec(dllexport) void OnBrowserChange();
__declspec(dllexport) void OnWindowChange();
__declspec(dllexport) void OnConnectionChange();
__declspec(dllexport) int OnWindowClose(int WindowType, BOOL Changed);
__declspec(dllexport) void OnWindowCreate(int WindowType);
__declspec(dllexport) void Configure();
__declspec(dllexport) void OnPopup(char *ObjectType, char *ObjectName);
__declspec(dllexport) void OnMainMenu(char *MenuName);
__declspec(dllexport) char *About();
__declspec(dllexport) BOOL OnTemplate(char *Filename, char **Data);
__declspec(dllexport) char *PlugInName();
__declspec(dllexport) char *PlugInSubName();
__declspec(dllexport) char *PlugInShortName();
__declspec(dllexport) char *RegisterFileSystem();
__declspec(dllexport) char *DirectFileLoad(char *Tag, char *Filename, int WindowType);
__declspec(dllexport) BOOL DirectFileSave(char *Tag, char *Filename, int WindowType);
__declspec(dllexport) char *RegisterExport();
__declspec(dllexport) void ExportInit();
__declspec(dllexport) void ExportFinished();
__declspec(dllexport) void ExportPrepare();
__declspec(dllexport) void ExportData();
}
extern "C" int _libmain(unsigned long reason)
{
if (reason == DLL_PROCESS_ATTACH) {
hm = LoadLibrary("PlugIns\\YourPlugInName.dll.relay");
if(hm == NULL)
{
return 0;
}
//Connect C function for the real DLL to the pointer
RegistercallbackFct = (RegisterCallbackPtr)GetProcAddress(hm, "RegisterCallback");
IdentifyPlugInFct = (IdentifyPlugInPtr)GetProcAddress(hm, "IdentifyPlugIn");
OnCreateFct = (OnCreatePtr)GetProcAddress(hm, "OnCreate");
OnActivateFct = (OnActivatePtr)GetProcAddress(hm, "OnActivate");
OnDeactivateFct = (OnDeactivatePtr)GetProcAddress(hm, "OnDeactivate");
OnDestroyFct = (OnDestroyPtr)GetProcAddress(hm, "OnDestroy");
CanCloseFct = (CanClosePtr)GetProcAddress(hm, "CanClose");
CreateMenuItemFct = (CreateMenuItemPtr)GetProcAddress(hm, "CreateMenuItem");
OnMenuClickFct = (OnMenuClickPtr)GetProcAddress(hm, "OnMenuClick");
OnBrowserChangeFct = (OnBrowserChangePtr)GetProcAddress(hm, "OnBrowserChange");
OnWindowChangeFct = (OnWindowChangePtr)GetProcAddress(hm, "OnWindowChange");
OnConnectionChangeFct = (OnConnectionChangePtr)GetProcAddress(hm, "OnConnectionChange");
OnWindowCloseFct = (OnWindowClosePtr)GetProcAddress(hm, "OnWindowClose");
OnWindowCreateFct = (OnWindowCreatePtr)GetProcAddress(hm, "OnWindowCreate");
ConfigureFct = (ConfigurePtr)GetProcAddress(hm, "Configure");
OnPopupFct = (OnPopupPtr)GetProcAddress(hm, "OnPopup");
OnMainMenuFct = (OnMainMenuPtr)GetProcAddress(hm, "OnMainMenu");
AboutFct = (AboutPtr)GetProcAddress(hm, "About");
OnTemplateFct = (OnTemplatePtr)GetProcAddress(hm, "OnTemplate");
PlugInNameFct = (PlugInNamePtr)GetProcAddress(hm, "PlugInName");
PlugInSubNameFct = (PlugInSubNamePtr)GetProcAddress(hm, "PlugInSubName");
PlugInShortNameFct = (PlugInShortNamePtr)GetProcAddress(hm, "PlugInShortName");
RegisterFileSystemFct = (RegisterFileSystemPtr)GetProcAddress(hm, "RegisterFileSystem");
DirectFileLoadFct = (DirectFileLoadPtr)GetProcAddress(hm, "DirectFileLoad");
DirectFileSaveFct = (DirectFileSavePtr)GetProcAddress(hm, "DirectFileSave");
RegisterExportFct = (RegisterExportPtr)GetProcAddress(hm, "RegisterExport");
ExportInitFct = (ExportInitPtr)GetProcAddress(hm, "ExportInit");
ExportFinishedFct = (ExportFinishedPtr)GetProcAddress(hm, "ExportFinished");
ExportPrepareFct = (ExportPreparePtr)GetProcAddress(hm, "ExportPrepare");
ExportDataFct = (ExportDataPtr)GetProcAddress(hm, "ExportData");
}
if (reason == DLL_PROCESS_DETACH) {
FreeLibrary(hm);
}
return 1;
}
extern "C" {
__declspec(dllexport) void RegisterCallback(int nIndex, void *pvAddr) {
if (RegistercallbackFct == NULL) {
return;
}
return RegistercallbackFct (nIndex, pvAddr);
}
__declspec(dllexport) char* IdentifyPlugIn(int ID) {
if (IdentifyPlugInFct == NULL) {
return "";
}
return IdentifyPlugInFct(ID);
}
__declspec(dllexport) void OnCreate() {
if (OnCreateFct == NULL) {
return;
}
return OnCreateFct();
}
__declspec(dllexport) void OnActivate() {
if (OnActivateFct == NULL) {
return;
}
return OnActivateFct();
}
__declspec(dllexport) void OnDeactivate() {
if (OnDeactivateFct == NULL) {
return;
}
return OnDeactivateFct();
}
__declspec(dllexport) void OnDestroy() {
if (OnDestroyFct == NULL) {
return;
}
return OnDestroyFct();
}
__declspec(dllexport) BOOL CanClose() {
if (CanCloseFct == NULL) {
return TRUE;
}
return CanCloseFct();
}
__declspec(dllexport) char* CreateMenuItem(int ID) {
if (CreateMenuItemFct == NULL) {
return NULL;
}
return CreateMenuItemFct(ID);
}
__declspec(dllexport) void OnMenuClick(int ID) {
if (OnMenuClickFct == NULL) {
return;
}
return OnMenuClickFct(ID);
}
__declspec(dllexport) void OnBrowserChange() {
if (OnBrowserChangeFct == NULL) {
return;
}
return OnBrowserChangeFct();
}
__declspec(dllexport) void OnWindowChange() {
if (OnWindowChangeFct == NULL) {
return;
}
return OnWindowChangeFct();
}
__declspec(dllexport) void OnConnectionChange() {
if (OnConnectionChangeFct == NULL) {
return;
}
return OnConnectionChangeFct();
}
__declspec(dllexport) int OnWindowClose(int WindowType, BOOL Changed) {
if (OnWindowCloseFct == NULL) {
return NULL;
}
return OnWindowCloseFct(WindowType, Changed);
}
__declspec(dllexport) void OnWindowCreate(int WindowType) {
if (OnWindowCreateFct == NULL) {
return;
}
return OnWindowCreateFct(WindowType);
}
__declspec(dllexport) void Configure() {
if (ConfigureFct == NULL) {
return;
}
return ConfigureFct();
}
__declspec(dllexport) void OnPopup(char *ObjectType, char *ObjectName) {
if (OnPopupFct == NULL) {
return;
}
return OnPopupFct(ObjectType, ObjectName);
}
__declspec(dllexport) void OnMainMenu(char *MenuName) {
if (OnMainMenuFct == NULL) {
return;
}
return OnMainMenuFct(MenuName);
}
__declspec(dllexport) char *About() {
if (AboutFct == NULL) {
return NULL;
}
return AboutFct();
}
__declspec(dllexport) BOOL OnTemplate(char *Filename, char **Data) {
if (OnTemplateFct == NULL) {
return TRUE;
}
return OnTemplateFct(Filename, Data);
}
__declspec(dllexport) char *PlugInName() {
if (PlugInName == NULL) {
return NULL;
}
return PlugInNameFct();
}
__declspec(dllexport) char *PlugInSubName() {
if (PlugInSubNameFct == NULL) {
return NULL;
}
return PlugInSubNameFct();
}
__declspec(dllexport) char *PlugInShortName() {
if (PlugInShortNameFct == NULL) {
return NULL;
}
return PlugInShortNameFct();
}
__declspec(dllexport) char *RegisterFileSystem() {
if (RegisterFileSystemFct == NULL) {
return NULL;
}
return RegisterFileSystemFct();
}
__declspec(dllexport) char *DirectFileLoad(char *Tag, char *Filename, int WindowType) {
if (DirectFileLoadFct == NULL) {
return NULL;
}
return DirectFileLoadFct(Tag, Filename, WindowType);
}
__declspec(dllexport) BOOL DirectFileSave(char *Tag, char *Filename, int WindowType) {
if (DirectFileSaveFct == NULL) {
return NULL;
}
return DirectFileSaveFct(Tag, Filename, WindowType);
}
__declspec(dllexport) char *RegisterExport() {
if (RegisterExportFct == NULL) {
return NULL;
}
return RegisterExportFct();
}
__declspec(dllexport) void ExportInit() {
if (ExportInitFct == NULL) {
return;
}
ExportInitFct();
}
__declspec(dllexport) void ExportFinished() {
if (ExportFinishedFct == NULL) {
return;
}
ExportFinishedFct();
}
__declspec(dllexport) void ExportPrepare() {
if (ExportPrepareFct == NULL) {
return;
}
ExportPrepareFct();
}
__declspec(dllexport) void ExportData() {
if (ExportDataFct == NULL) {
return;
}
ExportDataFct();
}
}