Модератор: BV
The trick писал(а):Разработчики видимо хотели в будущем добавить поддержку CDECL функций в VB, т.к. специально выделили для них специальные p-коды, но поддержку не добавили.
This method returns the FUNCDESC structure where the callconv member constains the calling convention of the external function. VBA6 then uses this information inside its own structiures which describesthe functions in the project. During P-code generation the runtime extracts this information to map the specified function with the corresponding p-codes. There is the table which manages the process of the codegenetraion:
Хакер писал(а):Неплохо было бы в той теме дать ссылку на эту тему.
Хакер писал(а):Они её сделали для билдов EB под Mac, а под Win заглушили.
Option Explicit
Public Declare Function SumInt CDecl Lib "test_lib" (ByVal a As Long, ByVal b As Long) As Long
Sub main()
Debug.Print SumInt(1, 2)
End Sub
The trick писал(а):Понятно, кстати я еще не проверял почему, но иногда ключевое слово Cdecl не вызывает ошибки
Хакер писал(а):Или речь о том, что она всегда принимается, но при компиляции вызывает Compile error?
Хакер писал(а):Что если add-in'у подвернётся некий особый билд VBA6.DLL, в котором никакой проблемы нет. Как поведёт себя Add-in в таком случае? Предположим, что сигнатуры для поиска ключевых мест останутся актуальными.
The trick писал(а):(возможно Хакер лучше знает). В общем в рантайме есть такое место где проверяется соглашение вызова функции объявленной через Declare:
The trick писал(а): Насколько я понимаю в EDI содержится дескриптор функции, т.к. к примеру если у нас есть функция объявленная через Declare с ключевым словом Cdecl то при изменении этих флагов меняется и отображаемый текст декларации функции.
Хакер писал(а):Я примерно понимаю, почему ты прячешь колонку с VA в отладчике (потому что в разных билдах разные базы и layout функций), но если бы ты всё-таки приводил адреса (по-моему у нас одинаковый билд), мне было бы проще ответить. Возможно я и разреверсил это место и оно мне знакомо, но я не могу опознать его по 5 инструкциям процессора.
Хакер писал(а):Могу предположить, что эта структура известна мне под временным именем BLOCK-5 — это дочерняя структура, поддерживаемая экземплярами класса CMSNR (тоже временное рабочее название — расшифровывается как Module-specific Name-related). Этот объект в виде разных структур хранит бинарное представление различных сущностей, объявленных в модуле. Например Enum описывается структурой типа BLOCK-3.
Для BLOCK-5 у меня вот такое описание по результатам моих исследований
The trick писал(а):никогда туда управление не передается
Хакер писал(а):Туда это куда?
Хакер писал(а):Я бы не торопился выкладывать, если ты анонсируешь где-то подобные add-in'ы (типа vbforums), а хорошо потестировал и изучил. Потому что уйдёт в народ, а потом замучаешься искоренять неправильный add-in, если он окажется таковым.
Option Explicit
Private Declare Sub qsort CDecl Lib "msvcrt" ( _
ByRef pFirst As Any, _
ByVal lNumber As Long, _
ByVal lSize As Long, _
ByVal pfnComparator As Long)
Sub Main()
Dim z() As Long
Dim i As Long
Dim s As String
ReDim z(10)
For i = 0 To UBound(z)
z(i) = Int(Rnd * 1000)
Next
qsort z(0), UBound(z) + 1, LenB(z(0)), AddressOf Comparator
For i = 0 To UBound(z)
s = s & CStr(z(i)) & vbNewLine
Next
MsgBox s
End Sub
Private Function Comparator CDecl( _
ByRef a As Long, _
ByRef b As Long) As Long
Comparator = a - b
End Function
The trick писал(а): т.к. попалась еще одна vba6.dll в которой они немного отличались от первоначальных.
Хакер писал(а):Ты коллекционируешь разные билды vba6.dll?
//=--------------------------------------------------------------------------=
// kwid.h
//=--------------------------------------------------------------------------=
// Copyright (c) 1988-1996, Microsoft Corporation
// All Rights Reserved
// Information Contained Herein Is Proprietary and Confidential.
//=--------------------------------------------------------------------------=
#ifndef _KWID_H_
#define _KWID_H_
#define KWID_tkNone 0
#define KWID_tkABS 1
#define KWID_tkACCESS 2
#define KWID_tkADDRESSOF 3
#define KWID_tkALIAS 4
#define KWID_tkAND 5
#define KWID_tkANY 6
#define KWID_tkAPPEND 7
#define KWID_tkARRAY 8
#define KWID_tkAS 9
#define KWID_tkASSERT 10
#define KWID_tkB 11
#define KWID_tkBASE 12
#define KWID_tkBF 13
#define KWID_tkBINARY 14
#define KWID_tkBOOLEAN 15
#define KWID_tkBYREF 16
#define KWID_tkBYTE 17
#define KWID_tkBYVAL 18
#define KWID_tkCALL 19
#define KWID_tkCASE 20
#define KWID_tkCBOOL 21
#define KWID_tkCBYTE 22
#define KWID_tkCCUR 23
#define KWID_tkCDATE 24
#define KWID_tkCDEC 25
#define KWID_tkCDBL 26
#define KWID_tkCDECL 27
#define KWID_tkCHDIR 28
#define KWID_tkCINT 29
#define KWID_tkCIRCLE 30
#define KWID_tkCLNG 31
#define KWID_tkCLOSE 32
#define KWID_tkCOMPARE 33
#define KWID_tkCONST 34
#define KWID_tkCSNG 35
#define KWID_tkCSTR 36
#define KWID_tkCURDIR 37
#define KWID_tkCURDIRstr 38
#define KWID_tkCVAR 39
#define KWID_tkCVDATE 40
#define KWID_tkCVERR 41
#define KWID_tkCURRENCY 42
#define KWID_tkDATABASE 43
#define KWID_tkDATE 44
#define KWID_tkDATEstr 45
#define KWID_tkDEBUG 46
#define KWID_tkDECIMAL 47
#define KWID_tkDECLARE 48
#define KWID_tkDEFBOOL 49
#define KWID_tkDEFBYTE 50
#define KWID_tkDEFCUR 51
#define KWID_tkDEFDATE 52
#define KWID_tkDEFDEC 53
#define KWID_tkDEFDBL 54
#define KWID_tkDEFINT 55
#define KWID_tkDEFLNG 56
#define KWID_tkDEFOBJ 57
#define KWID_tkDEFSNG 58
#define KWID_tkDEFSTR 59
#define KWID_tkDEFVAR 60
#define KWID_tkDIM 61
#define KWID_tkDIR 62
#define KWID_tkDIRstr 63
#define KWID_tkDO 64
#define KWID_tkDOEVENTS 65
#define KWID_tkDOUBLE 66
#define KWID_tkEACH 67
#define KWID_tkELSE 68
#define KWID_tkELSEIF 69
#define KWID_tkEMPTY 70
#define KWID_tkEND 71
#define KWID_tkENDIF 72
#define KWID_tkENUM 73
#define KWID_tkEQV 74
#define KWID_tkERASE 75
#define KWID_tkERROR 76
#define KWID_tkERRORstr 77
#define KWID_tkEVENT 78
#define KWID_tkEXIT 79
#define KWID_tkEXPLICIT 80
#define KWID_tkF 81
#define KWID_tkFALSE 82
#define KWID_tkFIX 83
#define KWID_tkFOR 84
#define KWID_tkFORMAT 85
#define KWID_tkFORMATstr 86
#define KWID_tkFREEFILE 87
#define KWID_tkFRIEND 88
#define KWID_tkFUNCTION 89
#define KWID_tkGET 90
#define KWID_tkGLOBAL 91
#define KWID_tkGO 92
#define KWID_tkGOSUB 93
#define KWID_tkGOTO 94
#define KWID_tkIF 95
#define KWID_tkIMP 96
#define KWID_tkIMPLEMENTS 97
#define KWID_tkIN 98
#define KWID_tkINPUT 99
#define KWID_tkINPUTstr 100
#define KWID_tkINPUTB 101
#define KWID_tkINPUTBstr 102
#define KWID_tkINSTR 103
#define KWID_tkINSTRB 104
#define KWID_tkINT 105
#define KWID_tkINTEGER 106
#define KWID_tkIS 107
#define KWID_tkLBOUND 108
#define KWID_tkLEFT 109
#define KWID_tkLEN 110
#define KWID_tkLENB 111
#define KWID_tkLET 112
#define KWID_tkLIB 113
#define KWID_tkLIKE 114
#define KWID_tkLINE 115
#define KWID_tkLINEINPUT 116
#define KWID_tkLOAD 117
#define KWID_tkLOCAL 118
#define KWID_tkLOCK 119
#define KWID_tkLONG 120
#define KWID_tkLOOP 121
#define KWID_tkLSET 122
#define KWID_tkME 123
#define KWID_tkMID 124
#define KWID_tkMIDstr 125
#define KWID_tkMIDB 126
#define KWID_tkMIDBstr 127
#define KWID_tkMOD 128
#define KWID_tkMODULE 129
#define KWID_tkNAME 130
#define KWID_tkNEW 131
#define KWID_tkNEXT 132
#define KWID_tkNOT 133
#define KWID_tkNOTHING 134
#define KWID_tkNULL 135
#define KWID_tkOBJECT 136
#define KWID_tkON 137
#define KWID_tkOPEN 138
#define KWID_tkOPTION 139
#define KWID_tkOPTIONAL 140
#define KWID_tkOR 141
#define KWID_tkOUTPUT 142
#define KWID_tkPARAMARRAY 143
#define KWID_tkPRESERVE 144
#define KWID_tkPRINT 145
#define KWID_tkPRIVATE 146
#define KWID_tkPROPERTY 147
#define KWID_tkPSET 148
#define KWID_tkPUBLIC 149
#define KWID_tkPUT 150
#define KWID_tkRAISEEVENT 151
#define KWID_tkRANDOM 152
#define KWID_tkRANDOMIZE 153
#define KWID_tkREAD 154
#define KWID_tkREDIM 155
#define KWID_tkREM 156
#define KWID_tkRESUME 157
#define KWID_tkRETURN 158
#define KWID_tkRGB 159
#define KWID_tkRSET 160
#define KWID_tkSCALE 161
#define KWID_tkSEEK 162
#define KWID_tkSELECT 163
#define KWID_tkSET 164
#define KWID_tkSGN 165
#define KWID_tkSHARED 166
#define KWID_tkSINGLE 167
#define KWID_tkSPC 168
#define KWID_tkSTATIC 169
#define KWID_tkSTEP 170
#define KWID_tkSTOP 171
#define KWID_tkSTRCOMP 172
#define KWID_tkSTRING 173
#define KWID_tkSTRINGstr 174
#define KWID_tkSUB 175
#define KWID_tkTAB 176
#define KWID_tkTEXT 177
#define KWID_tkTHEN 178
#define KWID_tkTO 179
#define KWID_tkTRUE 180
#define KWID_tkTYPE 181
#define KWID_tkTYPEOF 182
#define KWID_tkUBOUND 183
#define KWID_tkUNLOAD 184
#define KWID_tkUNLOCK 185
#define KWID_tkUNKNOWN 186
#define KWID_tkUNTIL 187
#define KWID_tkVARIANT 188
#define KWID_tkWEND 189
#define KWID_tkWHILE 190
#define KWID_tkWIDTH 191
#define KWID_tkWITH 192
#define KWID_tkWITHEVENTS 193
#define KWID_tkWRITE 194
#define KWID_tkXOR 195
#define KWID_tkHackConst 196
#define KWID_tkHackElse 197
#define KWID_tkHackElseif 198
#define KWID_tkHackEnd 199
#define KWID_tkHackIf 200
#define KWID_tkATTRIBUTE 201
#define KWID_tkVB_BASE 202
#define KWID_tkVB_CONTROL 203
#define KWID_tkVB_CREATABLE 204
#define KWID_tkVB_CUSTOMIZABLE 205
#define KWID_tkVB_DESCRIPTION 206
#define KWID_tkVB_EXPOSED 207
#define KWID_tkVB_EXT_KEY 208
#define KWID_tkVB_HELPID 209
#define KWID_tkVB_INVOKE_FUNC 210
#define KWID_tkVB_INVOKE_PROPERTYGET 211
#define KWID_tkVB_INVOKE_PROPERTYPUT 212
#define KWID_tkVB_INVOKE_PROPERTYPUTREF 213
#define KWID_tkVB_MEMBERFLAGS 214
#define KWID_tkVB_NAME 215
#define KWID_tkVB_PREDECLID 216
#define KWID_tkVB_PROCDATA 217
#define KWID_tkVB_TEMPLATEDERIVED 218
#define KWID_tkVB_VARDESCRIPTION 219
#define KWID_tkVB_VARHELPID 220
#define KWID_tkVB_VARMEMBERFLAGS 221
#define KWID_tkVB_VARPROCDATA 222
#define KWID_tkVB_USERMEMID 223
#define KWID_tkVB_VARUSERMEMID 224
#define KWID_tkVB_GLOBALNAMESPACE 225
#define KWID_tkListSep 226
#define KWID_tkDecimalSep 227
#define KWID_tkDQuote 228
#define KWID_tkLineCont 229
#define KWID_tkUnused08 230
#define KWID_tkUnused09 231
#define KWID_tkUnused10 232
#define KWID_tkUnused11 233
#define KWID_tkUnused12 234
#define KWID_tkUnused13 235
#define KWID_tkUnused14 236
#define KWID_tkUnused15 237
#define KWID_tkUnused16 238
#define KWID_tkUnused17 239
#define KWID_tkUnused18 240
#define KWID_tkUnused19 241
#define KWID_tkUnused20 242
#define KWID_tkID 243
#define KWID_tkBang 244
#define KWID_tkSharp 245
#define KWID_tkConcat 246
#define KWID_tkSQuote 247
#define KWID_tkLParen 248
#define KWID_tkRParen 249
#define KWID_tkMult 250
#define KWID_tkPlus 251
#define KWID_tkMinus 252
#define KWID_tkDot 253
#define KWID_tkDiv 254
#define KWID_tkColon 255
#define KWID_tkSColon 256
#define KWID_tkLT 257
#define KWID_tkLE 258
#define KWID_tkNE 259
#define KWID_tkEQ 260
#define KWID_tkLE2 261
#define KWID_tkGE2 262
#define KWID_tkGT 263
#define KWID_tkNE2 264
#define KWID_tkGE 265
#define KWID_tkQMark 266
#define KWID_tkIDiv 267
#define KWID_tkPwr 268
#define KWID_tkColEq 269
#define KWID_tkComma 270
#define CCH_MAX_KEYWORD_LEN 80
#define CCH_MAX_LINE_LEN 1023
#endif // ifndef _KWID_H_
The trick писал(а): меня для VBA6 нет DBG файла, точнее он есть но в нем толком ничего нет.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5