Hello, guys!
I remembered, that about a year ago or more I made a review of C declarations for all PL/SQL Developer v14 callback functions. I found many mistakes in documentation file plugindoc.pdf and in header files available in PlugInDoc folder.
I like pure ASM and C and minimalism So, this is my version, every function was checked: some successfully used by my plugin or in test-cases, and the signatures of the rest was compared with disassembled code in IDA.
How to use it:
1. Define structure, that receive functions' addresses through RegisterCallback()
You may [un]comment any function placeholders without worrying about gaps. But note the ascending order of indexes!
2. RegisterCallback() source
3. Usage of functions:
Maybe it helps someone.
I remembered, that about a year ago or more I made a review of C declarations for all PL/SQL Developer v14 callback functions. I found many mistakes in documentation file plugindoc.pdf and in header files available in PlugInDoc folder.
I like pure ASM and C and minimalism So, this is my version, every function was checked: some successfully used by my plugin or in test-cases, and the signatures of the rest was compared with disassembled code in IDA.
How to use it:
1. Define structure, that receive functions' addresses through RegisterCallback()
You may [un]comment any function placeholders without worrying about gaps. But note the ascending order of indexes!
Code
struct { //int (*SYS_Version)() = (int(*)()) 1; //char*(*SYS_Registry)() = (char*(*)()) 2; //char*(*SYS_RootDir)() = (char*(*)()) 3; //char*(*SYS_OracleHome)() = (char*(*)()) 4; //char*(*SYS_OCIDLL)() = (char*(*)()) 5; //BOOL (*SYS_OCI8Mode)() = (BOOL(*)()) 6; //BOOL (*SYS_XPStyle)() = (BOOL(*)()) 7; //char*(*SYS_TNSNAMES)(char *Param) = (char*(*)(char*)) 8; //int (*SYS_DelphiVersion)() = (int(*)()) 9; void (*IDE_MenuState)(int ID, int Index, BOOL Enabled) = (void(*)(int, int, BOOL)) 10; //BOOL (*IDE_Connected)() = (BOOL(*)()) 11; void (*IDE_GetConnectionInfo)(char** Username, char** Password, char** Database) = (void(*)(char**, char**, char**)) 12; //void (*IDE_GetBrowserInfo)(char **ObjectType, char **ObjectOwner, char **ObjectName) = (void(*)(char**, char**, char**)) 13; int (*IDE_GetWindowType)() = (int(*)()) 14; //int (*IDE_GetAppHandle)() = (int(*)()) 15; HWND (*IDE_GetWindowHandle)() = (HWND(*)()) 16; //HWND (*IDE_GetClientHandle)() = (HWND(*)()) 17; HWND (*IDE_GetChildHandle)() = (HWND(*)()) 18; void (*IDE_Refresh)() = (void(*)()) 19; //void (*IDE_CreateWindow)(int WindowType, char *Text, BOOL Execute) = (void(*)(int, char*, BOOL)) 20; //BOOL (*IDE_OpenFile)(int WindowType, char *Filename) = (BOOL(*)(int, char*)) 21; //BOOL (*IDE_SaveFile)() = (BOOL(*)()) 22; //char*(*IDE_Filename)() = (char*(*)()) 23; //void (*IDE_CloseFile)() = (void(*)()) 24; void (*IDE_SetReadOnly)(BOOL ReadOnly) = (void(*)(BOOL)) 25; BOOL (*IDE_GetReadOnly)() = (BOOL(*)()) 26; //BOOL (*IDE_ExecuteSQLReport)(char *SQL, char *Title, BOOL Updateable) = (BOOL(*)(char*, char*, BOOL)) 27; //BOOL (*IDE_ReloadFile)() = (BOOL(*)()) 28; //void (*IDE_SetFilename)(char *Filename) = (void(*)(char*)) 29; //char*(*IDE_GetText)() = (char*(*)()) 30; char*(*IDE_GetSelectedText)() = (char*(*)()) 31; char*(*IDE_GetCursorWord)() = (char*(*)()) 32; int (*IDE_GetEditorHandle)() = (int(*)()) 33; //BOOL (*IDE_SetText)(char *Text) = (BOOL(*)(char*)) 34; //BOOL (*IDE_SetStatusMessage)(char *Text) = (BOOL(*)(char*)) 35; //BOOL (*IDE_SetErrorPosition)(int Line, int Col) = (BOOL(*)(int, int)) 36; //void (*IDE_ClearErrorPositions)() = (void(*)()) 37; //int (*IDE_GetCursorWordPosition)() = (int(*)()) 38; //BOOL (*IDE_Perform)(int Param) = (BOOL(*)(int)) 39; //int (*SQL_Execute)(char *SQL) = (int(*)(char*)) 40; //int (*SQL_FieldCount)() = (int(*)()) 41; //BOOL (*SQL_Eof)() = (BOOL(*)()) 42; //int (*SQL_Next)() = (int(*)()) 43; //char*(*SQL_Field)(int Field) = (char*(*)(int)) 44; //char*(*SQL_FieldName)(int Field) = (char*(*)(int)) 45; //int (*SQL_FieldIndex)(char *Name) = (int(*)(char*)) 46; //int (*SQL_FieldType)(int Field) = (int(*)(int)) 47; //char*(*SQL_ErrorMessage)() = (char*(*)()) 48; //BOOL (*SQL_UsePlugInSession)(int PlugInID) = (BOOL(*)(int)) 50; //void (*SQL_UseDefaultSession)(int PlugInID) = (void(*)(int)) 51; //BOOL (*SQL_CheckConnection)() = (BOOL(*)()) 52; //char*(*SQL_GetDBMSGetOutput)() = (char*(*)()) 53; //void (*SQL_SetVariable)(char *Name, char *Value) = (void(*)(char*, char*)) 54; //char*(*SQL_GetVariable)(char *Name) = (char*(*)(char*)) 55; //void (*SQL_ClearVariables)() = (void(*)()) 56; //BOOL (*SQL_SetPlugInSession)(int PlugInID, char *Username, char *Password, char *Database, char *ConnectAs) = (BOOL(*)(int, char*, char*, char*, char*)) 57; //char*(*IDE_GetCustomKeywords)() = (char*(*)()) 60; //void (*IDE_SetCustomKeywords)(char *Keywords) = (void(*)(char*)) 61; //void (*IDE_SetKeywords)(int ID, int Style, char *Keywords) = (void(*)(int, int, char*)) 62; //void (*IDE_ActivateKeywords)() = (void(*)()) 63; //void (*IDE_RefreshMenus)(int ID) = (void(*)(int)) 64; //void (*IDE_SetMenuName)(int ID, int Index, char *Name) = (void(*)(int, int, char*)) 65; //void (*IDE_SetMenuCheck)(int ID, int Index, BOOL Enabled) = (void(*)(int, int, BOOL)) 66; //void (*IDE_SetMenuVisible)(int ID, int Index, BOOL Enabled) = (void(*)(int, int, BOOL)) 67; //char*(*IDE_GetMenulayout)() = (char*(*)()) 68; //void (*IDE_CreatePopupItem)(int ID, int Index, char *Name, char *ObjectType) = (void(*)(int, int, char*, char*)) 69; //BOOL (*IDE_SetConnection)(char *Username, char *Password, char *Database) = (BOOL(*)(char*, char*, char*)) 70; //void (*IDE_GetObjectInfo)(char *AnObject, char **ObjectType, char **ObjectOwner, char **ObjectName, char **SubObject) = (void(*)(char*, char**, char**, char**, char**)) 71; //char*(*IDE_GetBrowserItems)(char *Node, BOOL GetItems) = (char*(*)(char*, BOOL)) 72; //void (*IDE_RefreshBrowser)(char *Node) = (void(*)(char*)) 73; //void (*IDE_GetPopupObject)(char **ObjectType, char **ObjectOwner, char **ObjectName, char **SubObject) = (void(*)(char**, char**, char**, char**)) 74; //char*(*IDE_GetPopupBrowserRoot)() = (char*(*)()) 75; //void (*IDE_RefreshObject)(char *ObjectType, char *ObjectOwner, char *ObjectName, int Action) = (void(*)(char*, char*, char*, int)) 76; //BOOL (*IDE_FirstSelectedObject)(char **ObjectType, char **ObjectOwner, char **ObjectName, char **SubObject) = (BOOL(*)(char**, char**, char**, char**)) 77; //BOOL (*IDE_NextSelectedObject)(char **ObjectType, char **ObjectOwner, char **ObjectName, char **SubObject) = (BOOL(*)(char**, char**, char**, char**)) 78; //char*(*IDE_GetObjectSource)(char *ObjectType, char *ObjectOwner, char *ObjectName) = (char*(*)(char*, char*, char*)) 79; //int (*IDE_GetWindowCount)() = (int(*)()) 80; //BOOL (*IDE_SelectWindow)(int Index) = (BOOL(*)(int)) 81; BOOL (*IDE_ActivateWindow)(HWND Index) = (BOOL(*)(HWND)) 82; //BOOL (*IDE_WindowIsModified)() = (BOOL(*)()) 83; //BOOL (*IDE_WindowIsRunning)() = (BOOL(*)()) 84; //int (*IDE_WindowPin)(int Pin) = (int(*)(int)) 85; //void (*IDE_SplashCreate)(int ProgressMax) = (void(*)(int)) 90; //void (*IDE_SplashHide)() = (void(*)()) 91; //void (*IDE_SplashWrite)(char *s) = (void(*)(char*)) 92; //void (*IDE_SplashWriteLn)(char *s) = (void(*)(char*)) 93; //void (*IDE_SplashProgress)(int Progress) = (void(*)(int)) 94; //char*(*IDE_TemplatePath)() = (char*(*)()) 95; //BOOL (*IDE_ExecuteTemplate)(char *Template, BOOL NewWindow) = (BOOL(*)(char*, BOOL)) 96; //char*(*IDE_GetConnectAs)() = (char*(*)()) 97; //BOOL (*IDE_SetConnectionAs)(char *Username, char *Password, char *Database, char *ConnectAs) = (BOOL(*)(char*, char*, char*, char*)) 98; //char*(*IDE_GetFileOpenMenu)(int MenuIndex, int *WindowType) = (char*(*)(int, int*)) 100; //BOOL (*IDE_CanSaveWindow)() = (BOOL(*)()) 101; //void (*IDE_OpenFileExternal)(int WindowType, char *Data, char *FileSystem, char *Tag, char *Filename) = (void(*)(int, char*, char*, char*, char*)) 102; //char*(*IDE_GetFileTypes)(int WindowType) = (char*(*)(int)) 103; //char*(*IDE_GetDefaultExtension)(int WindowType) = (char*(*)(int)) 104; //char*(*IDE_GetFiledata)() = (char*(*)()) 105; //void (*IDE_FileSaved)(char *FileSystem, char *FileTag, char *Filename) = (void(*)(char*, char*, char*)) 106; //BOOL (*IDE_ShowHTML)(char *Url, char *Hash, char *Title, char *ID) = (BOOL(*)(char*, char*, char*, char*)) 107; //BOOL (*IDE_RefreshHTML)(char *Url, char *ID, BOOL BringToFront) = (BOOL(*)(char*, char*, BOOL)) 108; //char*(*IDE_GetProcEditExtension)(char *oType) = (char*(*)(char*)) 109; //BOOL (*IDE_GetWindowObject)(char **ObjectType, char **ObjectOwner, char **ObjectName, char **SubObject) = (BOOL(*)(char**, char**, char**, char**)) 110; //char*(*IDE_FirstSelectedFile) (BOOL Files, BOOL Directories) = (char*(*) (BOOL, BOOL)) 111; //char*(*IDE_NextSelectedFile)() = (char*(*)()) 112; //void (*IDE_RefreshFileBrowser)() = (void(*)()) 113; //void (*IDE_KeyPress)(int Key, int Shift) = (void(*)(int, int)) 120; int (*IDE_GetMenuItem)(char *MenuName) = (int(*)(char*)) 121; BOOL (*IDE_SelectMenu)(int MenuItem) = (BOOL(*)(int)) 122; //char*(*IDE_GetMenuItemLayout)() = (char*(*)()) 123; //char*(*IDE_TranslationFile)() = (char*(*)()) 130; //char*(*IDE_TranslationLanguage)() = (char*(*)()) 131; //char*(*IDE_GetTranslatedMenuLayout)() = (char*(*)()) 132; //char*(*IDE_MainFont)() = (char*(*)()) 133; //char*(*IDE_TranslateItems)(char *Group) = (char*(*)(char*)) 134; //char*(*IDE_TranslateString)(char *ID, char *Default, char *Param1, char *Param2) = (char*(*)(char*, char*, char*, char*)) 135; //BOOL (*IDE_SaveRecoveryFiles)() = (BOOL(*)()) 140; int (*IDE_GetCursorX)() = (int(*)()) 141; int (*IDE_GetCursorY)() = (int(*)()) 142; void (*IDE_SetCursor)(int X, int Y) = (void(*)(int, int)) 143; int (*IDE_SetBookmark)(int Index, int X, int Y) = (int(*)(int, int, int)) 144; void (*IDE_ClearBookmark)(int Index) = (void(*)(int)) 145; void (*IDE_GotoBookmark)(int Index) = (void(*)(int)) 146; BOOL (*IDE_GetBookmark)(int Index, int *X, int *Y) = (BOOL(*)(int, int*, int*)) 147; //char*(*IDE_TabInfo)(int Index) = (char*(*)(int)) 148; //int (*IDE_TabIndex)(int Index) = (int(*)(int)) 149; //void (*IDE_CreateToolButton)(int ID, int Index, char *Name, char *BitmapFile, HBITMAP BitmapHandle) = (void(*)(int, int, char*, char*, HBITMAP)) 150; //void (*IDE_ShowToolButtonMenu)(int ID, int Index, char *Name, char *Items) = (void(*)(int, int, char*, char*)) 151; //BOOL (*IDE_WindowHasEditor)(BOOL CodeEditor) = (BOOL(*)(BOOL)) 153; int (*IDE_GetCursorWordOffset)() = (int(*)()) 154; //void (*IDE_SetSelectedText)(char *p) = (void(*)(char*)) 155; //int (*IDE_BeautifierOptions)() = (int(*)()) 160; //BOOL (*IDE_BeautifyWindow)() = (BOOL(*)()) 161; //char*(*IDE_BeautifyText)(char *s) = (char*(*)(char*)) 162; //BOOL (*IDE_ObjectAction)(char *Action, char *ObjectType, char *ObjectOwner, char *ObjectName) = (BOOL(*)(char*, char*, char*, char*)) 165; //BOOL (*IDE_ShowDialog)(char *Dialog, char *Param) = (BOOL(*)(char*, char*)) 166; //char*(*IDE_MainApplication)() = (char*(*)()) 170; //int (*IDE_MainForm)() = (int(*)()) 171; //int (*IDE_Mouse)(int) = (int(*)(int)) 172; void (*IDE_DebugLog)(char *Msg) = (void(*)(char*)) 173; //char*(*IDE_GetParamString)(char *Name) = (char*(*)(char*)) 174; //BOOL (*IDE_GetParamBool)(char *Name) = (BOOL(*)(char*)) 175; //void (*IDE_GetBrowserFilter)(int Index, char **Name, char **WhereClause, char **OrderByClause, char **User, BOOL *Active) = (void(*)(int, char**, char**, char**, char**, BOOL*)) 176; //char*(*IDE_GetSyntaxAnalyzer)(char *Name) = (char*(*)(char*)) 177; //int (*IDE_GetAppHandleEx)() = (int(*)()) 178; //void (*IDE_CommandFeedback)(int FeedbackHandle, char *s) = (void(*)(int, char*)) 180; //int (*IDE_ResultGridRowCount)() = (int(*)()) 190; //int (*IDE_ResultGridColCount)() = (int(*)()) 191; //char*(*IDE_ResultGridCell)(int Col, int Row) = (char*(*)(int, int)) 192; //int (*IDE_ResultGridVisibleColCount)() = (int(*)()) 193; //BOOL (*IDE_Authorized)(char *Category, char *Name, char *SubName) = (BOOL(*)(char*, char*, char*)) 200; //BOOL (*IDE_WindowAllowed)(int WindowType, BOOL ShowErrorMessage) = (BOOL(*)(int, BOOL)) 201; //BOOL (*IDE_Authorization)() = (BOOL(*)()) 202; //char*(*IDE_AuthorizationItems)(char *Category) = (char*(*)(char*)) 203; //void (*IDE_AddAuthorizationItem)(int PlugInID, char *Name) = (void(*)(int, char*)) 204; //char*(*IDE_GetPersonalPrefSets)() = (char*(*)()) 210; //char*(*IDE_GetDefaultPrefSets)() = (char*(*)()) 211; //char*(*IDE_GetPrefAsString)(int PlugInID, char *PrefSet, char *Name, char *Default) = (char*(*)(int, char*, char*, char*)) 212; //int (*IDE_GetPrefAsInteger)(int PlugInID, char *PrefSet, char *Name, int Default) = (int(*)(int, char*, char*, int)) 213; //BOOL (*IDE_GetPrefAsBool)(int PlugInID, char *PrefSet, char *Name, BOOL Default) = (BOOL(*)(int, char*, char*, BOOL)) 214; //BOOL (*IDE_SetPrefAsString)(int PlugInID, char *PrefSet, char *Name, char *Value) = (BOOL(*)(int, char*, char*, char*)) 215; //BOOL (*IDE_SetPrefAsInteger)(int PlugInID, char *PrefSet, char *Name, int Value) = (BOOL(*)(int, char*, char*, int)) 216; //BOOL (*IDE_SetPrefAsBool)(int PlugInID, char *PrefSet, char *Name, BOOL Value) = (BOOL(*)(int, char*, char*, BOOL)) 217; //char*(*IDE_GetGeneralPref)(char *Name) = (char*(*)(char*)) 218; //BOOL (*IDE_PlugInSetting)(int PlugInID, char *Setting, char *Value) = (BOOL(*)(int, char*, char*)) 219; //int (*IDE_GetProcOverloadCount)(char *Owner, char *PackageName, char *ProcedureName) = (int(*)(char*, char*, char*)) 220; //int (*IDE_SelectProcOverloading)(char *Owner, char *PackageName, char *ProcedureName) = (int(*)(char*, char*, char*)) 221; //char*(*IDE_GetSessionValue)(char *Name) = (char*(*)(char*)) 230; //BOOL (*IDE_CheckDBVersion)(char *Version) = (BOOL(*)(char*)) 231; //BOOL (*IDE_GetConnectionInfoEx)(int ix, char **Username, char **Password, char **Database, char **ConnectAs) = (BOOL(*)(int, char**, char**, char**, char**)) 240; //int (*IDE_FindConnection)(char *Username, char *Database, char *ConnectAs) = (int(*)(char*, char*, char*)) 241; //int (*IDE_AddConnection)(char *Username, char *Password, char *Database, char *ConnectAs) = (int(*)(char*, char*, char*, char*)) 242; //BOOL (*IDE_ConnectConnection)(int ix) = (BOOL(*)(int)) 243; //BOOL (*IDE_SetMainConnection)(int ix) = (BOOL(*)(int)) 244; //int (*IDE_GetWindowConnection)() = (int(*)()) 245; //BOOL (*IDE_SetWindowConnection)(int x) = (BOOL(*)(int)) 246; //BOOL (*IDE_GetConnectionTree)(int ix, char **Description, char **Username, char **Password, char **Database, char **ConnectAs, int *ID, int *ParentID) = (BOOL(*)(int, char**, char**, char**, char**, char**, int*, int*)) 247; //BOOL (*IDE_GetConnectionInfoEx10)(int ix, char **Username, char **Password, char **Database, char **ConnectAs, char **Edition, char **Workspace) = (BOOL(*)(int, char**, char**, char**, char**, char**, char**)) 250; //int (*IDE_FindConnectionEx10)(char *Username, char *Database, char *ConnectAs, char *Edition, char *Workspace) = (int(*)(char*, char*, char*, char*, char*)) 251; //int (*IDE_AddConnectionEx10)(char *Username, char *Password, char *Database, char *ConnectAs, char *Edition, char *Workspace) = (int(*)(char*, char*, char*, char*, char*, char*)) 252; //BOOL (*IDE_GetConnectionTreeEx10)(int ix, char **Description, char **Username, char **Password, char **Database, char **ConnectAs, char **Edition, char **Workspace, int *ID, int *ParentID) = (BOOL(*)(int, char**, char**, char**, char**, char**, char**, char**, int*, int*)) 253; //void (*IDE_ShowDifferences)(int PlugInID, char *Caption1, char *String1, char *Caption2, char *String2) = (void(*)(int, char*, char*, char*, char*)) 260; //void (*IDE_GetDiffPrefs)(BOOL *IgnoreCase, BOOL *IgnoreSpace, BOOL *IgnoreComment) = (void(*)(BOOL*, BOOL*, BOOL*)) 261; //void (*IDE_SetDiffPrefs)(BOOL IgnoreCase, BOOL IgnoreSpace, BOOL IgnoreComment) = (void(*)(BOOL, BOOL, BOOL)) 262; //int (*IDE_TestDifferences)(int PlugInID, char *Caption1, char *String1, char *Caption2, char *String2) = (int(*)(int, char*, char*, char*, char*)) 263; //char*(*IDE_GetUserPref)(char *Name) = (char*(*)(char*)) 266; //BOOL (*IDE_SetUserPref)(char *Name, char *Value) = (BOOL(*)(char*, char*)) 267; //void (*IDE_ApplyUserPrefs)() = (void(*)()) 268; //int (*IDE_290)() = (int(*)()) 290; //void*(*IDE_291)(char *p) = (void*(*)(char*)) 291; //char*(*SYS_OracleHomeName)() = (char*(*)()) 300; } f;
2. RegisterCallback() source
Code
__declspec(dllexport) void RegisterCallback(int Index, void* Addr) { for (void **p = (void**)&f; p < (void**)&f+sizeof(f)/sizeof(void*); p++) { if (*(int*)p == Index) { *p = Addr; break; } } }
3. Usage of functions:
Code
f.IDE_DebugLog(sError); ... char *username, *password, *database, s[256]; f.IDE_GetConnectionInfo(&username, &password, &database); ... f.IDE_SetReadOnly(!f.IDE_GetReadOnly()); ... int g_menu_FR = f.IDE_GetMenuItem("Edit / Search / Find Replace"); ... BOOL bm_exists = f.IDE_GetBookmark(Index, &bookX, &bookY);
Maybe it helps someone.