Okay, here is the PureBasic source code for anyone trying to write a plugin on there own. Maybe someone can help with this. NEEDS WORK!
I haven't tested the whole thing just the dependency functions, which crashes DBPro at the moment. I tried to make this example closely approximate IanM's C++ example.
IanM's Original C++ Example:
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include "globstruct.h"
#define EXPORT __declspec(dllexport)
#define EXPORTC extern "C" __declspec(dllexport)
// Function pointer typedefs
typedef void (* MakeMemblock_f)(int, int);
typedef void (* WriteMemblockDword_f)(int, int, DWORD);
typedef DWORD (* MemblockDword_f)(int, int);
typedef void (* DeleteMemblock_f)(int);
// Function pointers themselves
MakeMemblock_f dbMakeMemblock = 0;
WriteMemblockDword_f dbWriteMemblockDword = 0;
MemblockDword_f dbMemblockDword = 0;
DeleteMemblock_f dbDeleteMemblock = 0;
GlobStruct* Core = 0;
const char* Dependencies[] =
{
"DBProMemblocksDebug.dll",
};
EXPORT int GetNumDependencies( void )
{
return sizeof(Dependencies) / sizeof(const char*);
}
EXPORT char const* GetDependencyID(int ID)
{
return Dependencies[ID];
}
EXPORT void ReceiveCoreDataPtr(LPVOID CorePtr)
{
// Store the core pointer
Core = static_cast<GlobStruct*>( CorePtr );
// Further initialisation can be carried out here if necessary
dbMakeMemblock = (MakeMemblock_f) GetProcAddress(Core->g_Memblocks, "?MakeMemblock@@YAXHH@Z");
dbWriteMemblockDword = (WriteMemblockDword_f) GetProcAddress(Core->g_Memblocks, "?WriteMemblockDWord@@YAXHHK@Z");
dbMemblockDword = (MemblockDword_f) GetProcAddress(Core->g_Memblocks, "?ReadMemblockDWord@@YAKHH@Z");
dbDeleteMemblock = (DeleteMemblock_f) GetProcAddress(Core->g_Memblocks, "?DeleteMemblock@@YAXH@Z");
}
EXPORTC void MyMakeMemblock(int ID, int Size)
{
dbMakeMemblock(ID, Size);
}
EXPORTC void MyWriteMemblockDword(int ID, int Offset, DWORD Data)
{
dbWriteMemblockDword(ID, Offset, Data);
}
EXPORTC DWORD MyMemblockDword(int ID, int Offset)
{
return dbMemblockDword(ID, Offset);
}
EXPORTC void MyDeleteMemblock(int ID)
{
dbDeleteMemblock(ID);
}
My PureBasic 4.40 Example:
; USING DBPRO DEPENDENCIES IN PUREBASIC V4.40:
; For writing a TPC Plugin using Memblocks
; 2010 By D Ogre
IncludeFile "GlobStruct.pb"
; Define DBPro command prototypes (Could make this part an IncludeFile)
PrototypeC MakeMemblock_Prototype(a.l, b.l)
PrototypeC CopyMemblock_Prototype(a.l, b.l, c.l, d.l, e.l)
PrototypeC DeleteMemblock_Prototype(a.l)
PrototypeC.l MemblockExist_Prototype(a.l)
PrototypeC.l GetMemblockPtr_Prototype(a.l)
PrototypeC.l GetMemblockSize_Prototype(a.l)
PrototypeC CreateMemblockFromBitmap_Prototype(a.l, b.l)
PrototypeC CreateMemblockFromImage_Prototype(a.l, b.l)
PrototypeC CreateMemblockFromMesh_Prototype(a.l, b.l)
PrototypeC CreateMemblockFromSound_Prototype(a.l, b.l)
PrototypeC ChangeMeshFromMemblock_Prototype(a.l, b.l)
PrototypeC CreateBitmapFromMemblock_Prototype(a.l, b.l)
PrototypeC CreateImageFromMemblock_Prototype(a.l, b.l)
PrototypeC CreateMeshFromMemblock_Prototype(a.l, b.l)
PrototypeC CreateSoundFromMemblock_Prototype(a.l, b.l)
PrototypeC CreateMemblockFromArray_Prototype(a.l, b.l)
PrototypeC CreateArrayFromMemblock_Prototype(a.l, b.l)
PrototypeC.l ReadMemblockByte_Prototype(a.l, b.l)
PrototypeC.l ReadMemblockDword_Prototype(a.l, b.l)
PrototypeC.f ReadMemblockFloat_Prototype(a.l, b.l)
PrototypeC.l ReadMemblockDwordLLL_Prototype(a.l, b.l)
PrototypeC WriteMemblockByte_Prototype(a.l, b.l, c.l)
PrototypeC WriteMemblockDword_Prototype(a.l, b.l, c.l)
PrototypeC WriteMemblockFloat_Prototype(a.l, b.l, c.l)
PrototypeC WriteMemblockWord_Prototype(a.l, b.l, c.l)
Global DBP_MakeMemblock.MakeMemblock_Prototype
Global DBP_CopyMemblock.CopyMemblock_Prototype
Global DBP_DeleteMemblock.DeleteMemblock_Prototype
Global DBP_MemblockExist.MemblockExist_Prototype
Global DBP_GetMemblockPtr.GetMemblockPtr_Prototype
Global DBP_GetMemblockSize.GetMemblockSize_Prototype
Global DBP_CreateMemblockFromBitmap.CreateMemblockFromBitmap_Prototype
Global DBP_CreateMemblockFromImage.CreateMemblockFromImage_Prototype
Global DBP_CreateMemblockFromMesh.CreateMemblockFromMesh_Prototype
Global DBP_CreateMemblockFromSound.CreateMemblockFromSound_Prototype
Global DBP_ChangeMeshFromMemblock.CreateMeshFromMemblock_Prototype
Global DBP_CreateBitmapFromMemblock.CreateBitmapFromMemblock_Prototype
Global DBP_CreateImageFromeMemblock.CreateImageFromMemblock_Prototype
Global DBP_CreateMeshFromMemblock.CreateMeshFromMemblock_Prototype
Global DBP_CreateSoundFromMemblock.CreateSoundFromMemblock_Prototype
Global DBP_CreateMemblockFromArray.CreateMemblockFromArray_Prototype
Global DBP_CreateArrayFromMemblock.CreateArrayFromMemblock_Prototype
Global DBP_ReadMemblockByte.ReadMemblockByte_Prototype
Global DBP_ReadMemblockDword.ReadMemblockDword_Prototype
Global DBP_ReadMemblockFloat.ReadMemblockFloat_Prototype
Global DBP_ReadMemblockDwordLLL.ReadMemblockDwordLLL_Prototype
Global DBP_WriteMemblockByte.WriteMemblockByte_Prototype
Global DBP_WriteMemblockDword.WriteMemblockDword_Prototype
Global DBP_WriteMemblockFloat.WriteMemblockFloat_Prototype
Global DBP_WriteMemblockWord.WriteMemblockWord_Prototype
; Define the plugin dependency list in an array
Global Dim DBP_Dependencies.s(1)
DBP_Dependencies.s(0) = "DBProMemblocksDebug.dll"
; Tell DBPro what needs to be initialized in the plugin
; Note: To use change AConstructorOOYAXXZ to ?Constructor@@YAXXZ
; after compiling the DLL before you drop the plugin into the DBPro user
; plugins folder. You can either use a hex editor or the PPFixer utility
; supplied with PurePlugin.
;ProcedureCDLL AConstructor00YAXXZ()
;EndProcedure
; Tell DBPro what needs to be de-initialized in the plugin
; Note: To use change ADestructorOOYAXXZ to ?Destructor@@YAXXZ
; after compiling the DLL before you drop the plugin into the DBPro user
; plugins folder. You can either use a hex editor or the PPFixer utility
; supplied with PurePlugin.
; ProcedureCDLL ADestructor00YAXXZ()
; EndProcedure
; Tell DBPro how many dependencies we have
; Note: To use change AGetNumDependencies00YAHXZ to ?GetNumDependencies@@YAHXZ
; after compiling the DLL before you drop the plugin into the DBPro user
; plugins folder. You can either use a hex editor or the PPFixer utility
; supplied with PurePlugin.
ProcedureCDLL.l AGetNumDependencies00YAHXZ()
ProcedureReturn ArraySize(DBP_Dependencies.s())
EndProcedure
; Tell DBPro what the dependency names are in the list
; Note: To use change AGetDependencyID00YAPBDH0Z to ?GetDependencyID@@YAPBDH@Z
; after compiling the DLL before you drop the plugin into the DBPro user
; plugins folder. You can either use a hex editor or the PPFixer utility
; supplied with PurePlugin.
ProcedureCDLL.l AGetDependencyID00YAPBDH0Z(ID.l)
Dependency.s = DBP_Dependencies.s(ID)
ProcedureReturn @Dependency.s
EndProcedure
; Recieved DBPro core data pointer / Copy memblock function pointers into prototypes
; Note: To use change AReceiveCoreDataPtr00YAXPAX0Z to ?ReceiveCoreDataPtr@@YAXPAX@Z
; after compiling the DLL before you drop the plugin into the DBPro user
; plugins folder. You can use a hex editor. If the below works, I will update
; the PPFixer utility so it supports this function.
ProcedureCDLL AReceiveCoreDataPtr00YAXPAX0Z(*CorePtrHandle)
*GlobPtr = *corePtrHandle
; GetProcAddress_() expects ASCII even in Unicode (will return 0)
; To Force ASCII you can use Pseudotypes:
; Import "Kernel32.lib"
; GetProcAddressAscii_(Module, FunctionName.p-ascii) As "_GetProcAddress@8" ; Should be "GetProcAddress" for x64
; EndImport
DBP_MakeMemblock = GetProcAddress_(*GlobPtr\g_memblocks, "?MakeMemblock@@YAXHH@Z")
DBP_CopyMemblock = GetProcAddress_(*GlobPtr\g_memblocks, "?CopyMemblock@@YAXHHHHH@Z")
DBP_DeleteMemblock = GetProcAddress_(*GlobPtr\g_memblocks, "?DeleteMemblock@@YAXH@Z")
DBP_MemblockExist = GetProcAddress_(*GlobPtr\g_memblocks, "?MemblockExist@@YAHH@Z")
DBP_GetMemblockPtr = GetProcAddress_(*GlobPtr\g_memblocks, "?GetMemblockPtr@@YAKH@Z")
DBP_GetMemblockSize = GetProcAddress_(*GlobPtr\g_memblocks, "?GetMemblockSize@@YAHH@Z")
DBP_CreateMemblockFromBitmap = GetProcAddress_(*GlobPtr\g_memblocks, "?CreateMemblockFromBitmap@@YAXHH@Z")
DBP_CreateMemblockFromImage = GetProcAddress_(*GlobPtr\g_memblocks, "?CreateMemblockFromImage@@YAXHH@Z")
DBP_CreateMemblockFromMesh = GetProcAddress_(*GlobPtr\g_memblocks, "?CreateMemblockFromMesh@@YAXHH@Z")
DBP_CreateMemblockFromSound = GetProcAddress_(*GlobPtr\g_memblocks, "?CreateMemblockFromSound@@YAXHH@Z")
DBP_ChangeMeshFromMemblock = GetProcAddress_(*GlobPtr\g_memblocks, "?ChangeMeshFromMemblock@@YAXHH@Z")
DBP_CreateBitmapFromMemblock = GetProcAddress_(*GlobPtr\g_memblocks, "?CreateBitmapFromMemblock@@YAXHH@Z")
DBP_CreateImageFromMemblock = GetProcAddress_(*GlobPtr\g_memblocks, "?CreateImageFromMemblock@@YAXHH@Z")
DBP_CreateMeshFromMemblock = GetProcAddress_(*GlobPtr\g_memblocks, "?CreateMeshFromMemblock@@YAXHH@Z")
DBP_CreateSoundFromMemblock = GetProcAddress_(*GlobPtr\g_memblocks, "?CreateSoundFromMemblock@@YAXHH@Z")
DBP_CreateMemblockFromArray = GetProcAddress_(*GlobPtr\g_memblocks, "?CreateMemblockFromArray@@YAXHK@Z")
DBP_CreateArrayFromMemblock = GetProcAddress_(*GlobPtr\g_memblocks, "?CreateArrayFromMemblock@@YAXKH@Z")
DBP_ReadMemblockByte = GetProcAddress_(*GlobPtr\g_memblocks, "?ReadMemblockByte@@YAHHH@Z")
DBP_ReadMemblockDWord = GetProcAddress_(*GlobPtr\g_memblocks, "?ReadMemblockDWord@@YAKHH@Z")
DBP_ReadMemblockFloat = GetProcAddress_(*GlobPtr\g_memblocks, "?ReadMemblockFloat@@YAKHH@Z")
DBP_ReadMemblockWordLLL = GetProcAddress_(*GlobPtr\g_memblocks, "?ReadMemblockWordLLL@@YAHHH@Z")
DBP_WriteMemblockByte = GetProcAddress_(*GlobPtr\g_memblocks, "?WriteMemblockByte@@YAXHHH@Z")
DBP_WriteMemblockDWord = GetProcAddress_(*GlobPtr\g_memblocks, "?WriteMemblockDWord@@YAXHHK@Z")
DBP_WriteMemblockFloat = GetProcAddress_(*GlobPtr\g_memblocks, "?WriteMemblockFloat@@YAXHHM@Z")
DBP_WriteMemblockWord = GetProcAddress_(*GlobPtr\g_memblocks, "?WriteMemblockWord@@YAXHHH@Z")
EndProcedure
; * New PBPro user plugin commands here*
ProcedureCDLL MyMakeMemblock(ID.l, Size.l)
DBP_MakeMemblock(ID, Size)
EndProcedure
PureBasic Globstruct (May need updated):
;
; Update to use 6.0 changes
;
; needed Structures
Structure GlobChecklistStruct
dwStringSize.l : string.s
valuea.l : valueb.l : valuec.l : valued.l
fvaluea.f : fvalueb.f : fvaluec.f : fvalued.f
EndStructure
; Global DarkBasic Professional internal structure.
Structure GlobStruct
; Function Ptrs (For remote DLLs)
CreateDeleteString.l : ProcessMessageFunction.l : PrintStringFunction.l
UpdateFilenameFromVirtualTable.l : Decrypt.l : Encrypt.l
ChangeMouseFunction.l
SpareFunction1.l : SpareFunction2.l : SpareFunction3.l
; LEEMOD - 130604 - Access To ALL VARIABLES MEMORY
g_pVariableSpace.l
; LEEMOD - 150803 - Replace 'SpareFunction5' with 'g_pErrorHandler'
g_pErrorHandlerRef.l
; DLL Handles And Active Flags
g_GFX.l : g_Text.l : g_Basic2D.l : g_Sprites.l : g_Image.l
g_Input.l : g_System.l : g_File.l : g_FTP.l : g_Memblocks.l
g_Bitmap.l : g_Animation.l : g_Multiplayer.l : g_Basic3D.l : g_Camera3D.l
g_Matrix3D.l : g_Light3D.l : g_World3D.l : g_Particles.l : g_PrimObject.l
g_Vectors.l : g_XObject.l : g_3DSObject.l : g_MDLObject.l : g_MD2Object.l
g_MD3Object.l : g_Sound.l : g_Music.l : g_LODTerrain.l : g_Q2BSP.l
g_OwnBSP.l : g_BSPCompiler.l : g_CSG.l
g_igLoader.l : g_GameFX.l : g_Spare03.l : g_Spare04.l : g_Spare05.l
g_Spare06.l : g_Spare07.l : g_Spare08.l : g_Spare09.l : g_Spare10.l
g_Spare11.l : g_Spare12.l : g_Spare13.l : g_Spare14.l : g_Spare15.l
g_Spare16.l : g_Spare17.l : g_Spare18.l : g_Spare19.l : g_Spare20.l
g_GFXmade.b : g_Textmade.b : g_Basic2Dmade.b : g_Spritesmade.b : g_Imagemade.b
g_Inputmade.b : g_Systemmade.b : g_Filemade.b : g_FTPmade.b : g_Memblocksmade.b
g_Bitmapmade.b : g_Animationmade.b : g_Multiplayermade.b : g_Basic3Dmade.b : g_Camera3Dmade.b
g_Matrix3Dmade.b : g_Light3Dmade.b : g_World3Dmade.b : g_Particlesmade.b : g_PrimObjectmade.b
g_Vectorsmade.b : g_XObjectmade.b : g_3DSObjectmade.b : g_MDLObjectmade.b : g_MD2Objectmade.b
g_MD3Objectmade.b : g_Soundmade.b : g_Musicmade.b : g_LODTerrainmade.b : g_Q2BSPmade.b
g_OwnBSPmade.b : g_BSPCompilermade.b : g_CSGmade.b
g_igLoadermade.b : g_GameFXmade.b : g_Spare03made.b : g_Spare04made.b : g_Spare05made.b
g_Spare06made.b : g_Spare07made.b : g_Spare08made.b : g_Spare09made.b : g_Spare10made.b
g_Spare11made.b : g_Spare12made.b : g_Spare13made.b : g_Spare14made.b : g_Spare15made.b
g_Spare16made.b : g_Spare17made.b : g_Spare18made.b : g_Spare19made.b : g_Spare20made.b
; Executable Media Handlng Data
pEXEUnpackDirectory.b[260]
dwEncryptionUniqueKey.l : ppEXEAbsFilename.l
; LEEMOD - 200105 - Replace 'dwEMHDSpare2' with 'dwInternalFunctionCode'
dwInternalFunctionCode.l
dwEMHDSpare3.l : dwEMHDSpare4.l : dwEMHDSpare5.l
; Windows General Data
HWND.l : HINSTANCE.l
pWindowsTextEntry.l : bInvalidFlag.b : dwWindowWidth.l : dwWindowHeight.l
hAppIcon.l : dwAppDisplayModeUsing.l : dwWindowX.l : dwWindowY.l
hwndIGLoader.l : dwWGDSpare2.l : dwWGDSpare3.l : dwWGDSpare4.l : dwWGDSpare5.l
; Windows Mouse Data
bWindowsMouseVisible.l : iWindowsMouseX.l : iWindowsMouseY.l : iWindowsMouseClick.l
dwWMDSpare2.l : dwWMDSpare3.l : dwWMDSpare4.l : dwWMDSpare5.l
; Main Screen Data (backbuffer)
iScreenWidth.l : iScreenHeight.l : iScreenDepth.l : iNoDrawLeft.l : iNoDrawTop.l
iNoDrawRight.l : iNoDrawBottom.l : dwSafeRectMax.l : pSafeRects.l
dwMSDSpare3.l : dwMSDSpare4.l : dwMSDSpare5.l
; Bitmap And Surface Data (For drawing offscreen)
iCurrentBitmapNumber.l : pCurrentBitmapTexture.l : pCurrentBitmapSurface.l
pHoldBackBufferPtr.l : pHoldDepthBufferPtr.l
dwBSDSpare1.l : dwBSDSpare2.l : dwBSDSpare3.l : dwBSDSpare4.l : dwBSDSpare5.l
; Drawing Data
iCursorX.l : iCursorY.l : dwForeColor.l : dwBackColor.l : dwRenderCameraID.l
fReflectionPlaneX.f : fReflectionPlaneY.f : fReflectionPlaneZ.f
; MIKE - DARKSDK - 2011094
dwCurrentSetCameraID.l
lpDirectXVersionString.l : dw3DBackColor.l : dwDDSpare4.l : dwDDSpare5.l
; Checklist Data
checklistexists.b : checklisthasvalues.b : checklisthasstrings.b : checklistqty.l : dwChecklistArraySize.l
Checklist.GlobChecklistStruct
; Dependent 3D Data Exchange
iFogState.l : dwRedrawPhase.l : dwRedrawCount.l : dwStencilMode.l : dwStencilShadowCount.l
dwStencilReflectionCount.l : dwNumberOfPolygonsDrawn.l : dwNumberOfPrimCalls.l
dwStencilSpare3.l : dwStencilSpare4.l : dwStencilSpare5.l
; System States And Global Controls
bEscapeKeyEnabled.b : bSystemKeyEnabled.b
bSpareBool1.b : bSpareBool2.b : bSpareBool3.b : bSpareBool4.b : bSpareBool5.b
bSpareBool6.b : bSpareBool7.b : bSpareBool8.b : bSpareBool9.b
pExitPromptString.l : pExitPromptString2.l : iSoftwareVP.l
; Dynamic Memory Area For future expansion
dwDynMemSize.l : pDynMemPtr.l
EndStructure
; External Reference To Glob Pointer
Global *GlobPtr.GlobStruct
Structure char ; character structure
a.b
EndStructure
Edited: Change the beginning array element back to zero.