多实例外部引用如何进行编译链接?

zara 2010-01-12 04:11:27
在使用一些没有入档的函数时,比如 RegisterShellHookWindow() 这样的 user32.dll 中的函数,一般提供的 inc 和 lib 文件中并没有定义它。使用 LoadLibrary()/GetProcAddress() 的话,又比较麻烦。自己创建 inc/lib 文件,在使用 Masm32v7 和 vc6 的链接程序时,生成的最后的可执行程序,只有一个对 user32.dll 的引用是完整的,其它的模块名部分是空白。具体表现就是在 Exescope 这样的资源软件里,在 IMPORT 节只能看到一个对 user32.dll 的引用;用 Ollydbg 载入程序的话,另外的对 user32.dll 中函数的引用,只有函数名,没有 user32.dll 模块名,所以实际上对引用地址的修正也就没能完成。无疑,这样的程序是不能使用的。
我看到其实有不少的程序中对同以模块的多实例引用。比如手头的 Foxmail4 的主程序 Foxmail.exe,对 kernel32.dll 有 3 组引用;对 advapi32.dll 和 oleaut32.dll 及 user32.dll 都有 2 例引用。
所以有些不明白这样多例引用是如何创建的,编译/链接程序有特殊选项吗?

谢谢!

下面这个资源链接就是 Foxmail 的 IMPORT 节的截图
http://download.csdn.net/source/1987586
...全文
140 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
miaomiao83 2010-01-20
  • 打赏
  • 举报
回复
zara 2010-01-18
  • 打赏
  • 举报
回复
周末的时候,又试了些。发现一个更离奇的现象。
当严格按 gzgzlxg 朋友提供的格式的 def 文件创建 lib 文件时--即“函数名@参数 @序号”;我前面根据网上些搜索到的资料都是“函数名@?”这样的,就以为 ? 是表示函数参数个数的,没将它想成是函数序号--函数可以识别并被链接了,只是最后生成的 exe 文件对这些函数的引用,竟然是只有函数序号,而没有函数名称!
一般来说,对库 dll 中函数的引用,都是以函数名来进行的,序号只是个辅助的信息。只是通过序号,而没有函数名称信息,往往也是为了避免文件被分析。
更可怕的是,函数的序号可能被调整。即便是如 Windows 的核心库中的主要函数,也曾经发生过调整。我自己以前就遇到过 wsprintf() 被调整过,是在 Win98 那时吧,导致只通过函数序号进行引用的个当时相当具名的影碟播放软件“超级解霸”(?) 不能正常运行。
所以,对普通的程序而言,我想只通过函数序号的引用,应该是不被提倡的。

另外,用 dumpbin /exports 命令查看了下 Masm32 的几个主要 lib 文件,如 kernel32.lib、user32.lib、gdi32.lib、shell32.lib 和 advapi32.lib 等,它们的导出函数,都是没有序号的。
zara 2010-01-15
  • 打赏
  • 举报
回复
楼上朋友的意思是自己重建一个完整的 user32.lib,然后在链接的时候就使用这个 user32.dll,而不是再补充个需要的 user32.lib?
如果是这样的话,我觉得有些夸张了,尤其是只有相应的 dll 文件的时候。因为对那些除了极常见的几个系统 dll 文件可能找到相关的如上面这样的 def 文件,其它的从 dll 是无法简单地获得参数个数信息的,也就不能建立上面所示的 def 文件。vc6 的 dumpbin 程序生成的导出信息文件是没有参数个数的,因为 dll 文件中本来就没有直接的这方面的信息。网上找到的由 dll 创建 lib 文件的方法中所列的例子,往往也是没有参数个数信息,而只是函数的序号。
另外,我前面也曾提及,通过“lib /def:user32.def /machine:i386 /out:user32.lib” 创建的 lib 文件其实并不能正常使用。我对 lib 文件格式不了解,但简单地看了下,可以正常使用的 lib 文件中,对每个函数,除了编译名如“_ExitProcess@4”外,都有对应的真实的内部名“ExitProcess”。但上面这个通过 lib 由 def 文件创建的则没有那个真实的干净的没有任何修饰的内部名,都是带修饰的编译名。说实话,我对这个也比较困惑,是网上的说法都是谬误(这好象有些不妥,虽然也看到有一例同样遭遇),还是我使用方法上有问题(应该不会啊,我甚至都是复制了这些命令行来执行的)?我用的是 vc6 里的 lib.exe (6.00.8168) 和 link.exe (6.00.8168)。
gzgzlxg 2010-01-14
  • 打赏
  • 举报
回复
自己在inc或其他能够被引用的文件中定义。
zara 2010-01-14
  • 打赏
  • 举报
回复
呵呵,你好!
不是 MASM 和 VC 联编。是这样的,我习惯于用 WinAMP 放放小曲听,用的还是个比较老的版本,不支持多媒体按键,比如 Play/Pause 这样的。所以,就想写段程序将这些键转发给 WinAMP,在暂停播放等控制时就无须切换到 WinAMP,轻触一键便可完成。
要捕捉到这类按键消息,比较简单的就是使用 RegisterShellHookWindows() 函数了。 当然也可以用钩子,只是可能更烦琐些。
大致看了下 Foxmail.exe (v4.2),没能看出来用的是什么开发软件,连 IMPORT 节中也没明显的开发语言基础库,都是基本的 Windows 库引用。由于这个版本的 Foxmail 出来的相当的早了,应是 2002 年吧,所以能实现多实例导入,我想和链接程序版本关系不大?
我现在是将其一的 user32.dll 引用改了个名字,生成 exe 文件后再修改为 user32.dll。有点儿麻烦,也可以应付了。
gzgzlxg 2010-01-14
  • 打赏
  • 举报
回复
本来还想将这个def文件给贴完,既然你认为我说的不是你想要的,那就算了。
你的这个RegisterShellHookWindow函数,在masm汇编环境下,使用新建立的user32.inc和user32.lib中,可以编译和链接运行。
zara 2010-01-14
  • 打赏
  • 举报
回复
4 楼朋友说的是如何由 dll 创建所需要的 lib 库文件吧,这个和我最上面还不是一个问题。
而且,按照这个方法创建的 lib 好象也并不如预期;象 ActivateKeyboardLayout@8 最后回被认为 @8 是函数名的一部分,而不是指示参数个数,这是在最后生成的可执行程序中表现的;但如果没有 @8 的话,又会提示找不到 _ActivateKeyboardLayout@8 函数,这个是在链接的时候发生的。
gzgzlxg 2010-01-14
  • 打赏
  • 举报
回复
EnumDisplaySettingsA@12 @200
EnumDisplaySettingsExA@16 @201
EnumDisplaySettingsExW@16 @202
EnumDisplaySettingsW@12 @203
EnumPropsA@8 @204
EnumPropsExA@12 @205
EnumPropsExW@12 @206
EnumPropsW@8 @207
EnumThreadWindows@12 @208
EnumWindowStationsA@8 @209
EnumWindowStationsW@8 @210
EnumWindows@8 @211
EqualRect@8 @212
ExcludeUpdateRgn@8 @213
ExitWindowsEx@8 @214
FillRect@12 @215
FindWindowA@8 @216
FindWindowExA@16 @217
FindWindowExW@16 @218
FindWindowW@8 @219
FlashWindow@8 @220
FlashWindowEx@4 @221
FrameRect@12 @222
FreeDDElParam@8 @223
GetActiveWindow@0 @224
GetAltTabInfo@20 @225
GetAltTabInfoA@20 @226
GetAltTabInfoW@20 @227
GetAncestor@8 @228
GetAppCompatFlags2@4 @229
GetAppCompatFlags@4 @230
GetAsyncKeyState@4 @231
GetCapture@0 @232
GetCaretBlinkTime@0 @233
GetCaretPos@4 @234
GetClassInfoA@12 @235
GetClassInfoExA@12 @236
GetClassInfoExW@12 @237
GetClassInfoW@12 @238
GetClassLongA@8 @239
GetClassLongW@8 @240
GetClassNameA@12 @241
GetClassNameW@12 @242
GetClassWord@8 @243
GetClientRect@8 @244
GetClipCursor@4 @245
GetClipboardData@4 @246
GetClipboardFormatNameA@12 @247
GetClipboardFormatNameW@12 @248
GetClipboardOwner@0 @249
GetClipboardSequenceNumber@0 @250
GetClipboardViewer@0 @251
GetComboBoxInfo@8 @252
GetCursor@0 @253
GetCursorFrameInfo@20 @254
GetCursorInfo@4 @255
GetCursorPos@4 @256
GetDC@4 @257
GetDCEx@12 @258
GetDesktopWindow@0 @259
GetDialogBaseUnits@0 @260
GetDlgCtrlID@4 @261
GetDlgItem@8 @262
GetDlgItemInt@16 @263
GetDlgItemTextA@16 @264
GetDlgItemTextW@16 @265
GetDoubleClickTime@0 @266
GetFocus@0 @267
GetForegroundWindow@0 @268
GetGUIThreadInfo@8 @269
GetGuiResources@8 @270
GetIconInfo@8 @271
GetInputDesktop@0 @272
GetInputState@0 @273
GetInternalWindowPos@12 @274
GetKBCodePage@0 @275
GetKeyNameTextA@12 @276
GetKeyNameTextW@12 @277
GetKeyState@4 @278
GetKeyboardLayout@4 @279
GetKeyboardLayoutList@8 @280
GetKeyboardLayoutNameA@4 @281
GetKeyboardLayoutNameW@4 @282
GetKeyboardState@4 @283
GetKeyboardType@4 @284
GetLastActivePopup@4 @285
GetLastInputInfo@4 @286
GetListBoxInfo@4 @287
GetMenu@4 @288
GetMenuBarInfo@16 @289
GetMenuCheckMarkDimensions@0 @290
GetMenuContextHelpId@4 @291
GetMenuDefaultItem@12 @292
GetMenuInfo@8 @293
GetMenuItemCount@4 @294
GetMenuItemID@8 @295
GetMenuItemInfoA@16 @296
GetMenuItemInfoW@16 @297
GetMenuItemRect@16 @298
GetMenuState@12 @299
GetMenuStringA@20 @300
GetMenuStringW@20 @301
GetMessageA@16 @302
GetMessageExtraInfo@0 @303
GetMessagePos@0 @304
GetMessageTime@0 @305
GetMessageW@16 @306
GetMonitorInfoA@8 @307
GetMonitorInfoW@8 @308
GetMouseMovePointsEx@20 @309
GetNextDlgGroupItem@12 @310
GetNextDlgTabItem@12 @311
GetOpenClipboardWindow@0 @312
GetParent@4 @313
GetPriorityClipboardFormat@8 @314
GetProcessDefaultLayout@4 @315
GetProcessWindowStation@0 @316
GetProgmanWindow@0 @317
GetPropA@8 @318
GetPropW@8 @319
GetQueueStatus@4 @320
GetScrollBarInfo@12 @321
GetScrollInfo@12 @322
GetScrollPos@8 @323
GetScrollRange@16 @324
GetShellWindow@0 @325
GetSubMenu@8 @326
GetSysColor@4 @327
GetSysColorBrush@4 @328
GetSystemMenu@8 @329
GetSystemMetrics@4 @330
GetTabbedTextExtentA@20 @331
GetTabbedTextExtentW@20 @332
GetTaskmanWindow@0 @333
GetThreadDesktop@4 @334
GetTitleBarInfo@8 @335
GetTopWindow@4 @336
GetUpdateRect@12 @337
GetUpdateRgn@12 @338
GetUserObjectInformationA@20 @339
GetUserObjectInformationW@20 @340
GetUserObjectSecurity@20 @341
GetWinStationInfo@4 @342
GetWindow@8 @343
GetWindowContextHelpId@4 @344
GetWindowDC@4 @345
GetWindowInfo@8 @346
GetWindowLongA@8 @347
GetWindowLongW@8 @348
GetWindowModuleFileName@12 @349
GetWindowModuleFileNameA@12 @350
GetWindowModuleFileNameW@12 @351
GetWindowPlacement@8 @352
GetWindowRect@8 @353
GetWindowRgn@8 @354
GetWindowTextA@12 @355
GetWindowTextLengthA@4 @356
GetWindowTextLengthW@4 @357
GetWindowTextW@12 @358
GetWindowThreadProcessId@8 @359
GetWindowWord@8 @360
GrayStringA@36 @361
GrayStringW@36 @362
HideCaret@4 @363
HiliteMenuItem@16 @364
IMPGetIMEA@8 @365
IMPGetIMEW@8 @366
IMPQueryIMEA@4 @367
IMPQueryIMEW@4 @368
IMPSetIMEA@8 @369
IMPSetIMEW@8 @370
ImpersonateDdeClientWindow@8 @371
InSendMessage@0 @372
InSendMessageEx@4 @373
InflateRect@12 @374
InitializeLpkHooks@4 @375
InitializeWin32EntryTable@4 @376
InsertMenuA@20 @377
InsertMenuItemA@16 @378
InsertMenuItemW@16 @379
InsertMenuW@20 @380
InternalGetWindowText@12 @381
IntersectRect@12 @382
InvalidateRect@12 @383
InvalidateRgn@12 @384
InvertRect@8 @385
IsCharAlphaA@4 @386
IsCharAlphaNumericA@4 @387
IsCharAlphaNumericW@4 @388
IsCharAlphaW@4 @389
IsCharLowerA@4 @390
IsCharLowerW@4 @391
IsCharUpperA@4 @392
IsCharUpperW@4 @393
IsChild@8 @394
IsClipboardFormatAvailable@4 @395
IsDialogMessage@8 @396
IsDialogMessageA@8 @397
IsDialogMessageW@8 @398
IsDlgButtonChecked@8 @399
gzgzlxg 2010-01-14
  • 打赏
  • 举报
回复
如果lib库中没有这个函数,则需要重新从dll建立这个库,首先需要建立一个def文件,虽然可以用dumpbin或pexports来建立def,但是这样建立的def文件中没有堆栈说明和调用序号,这些都需要自己去修改,非常麻烦。
下面是user32.dll 的定义文件 user32.def,你回去用vc目录下的那个 lib.exe 来建立一个 user32.lib,这样就可以使用了。
命令如下:
lib /def:user32.def /machine:i386 /out:user32.lib

LIBRARY USER32.dll
EXPORTS
ActivateKeyboardLayout@8 @1
AdjustWindowRect@12 @2
AdjustWindowRectEx@16 @3
AlignRects@16 @4
AllowSetForegroundWindow@4 @5
AnimateWindow@12 @6
AnyPopup@0 @7
AppendMenuA@16 @8
AppendMenuW@16 @9
ArrangeIconicWindows@4 @10
AttachThreadInput@12 @11
BeginDeferWindowPos@4 @12
BeginPaint@8 @13
BlockInput@4 @14
BringWindowToTop@4 @15
BroadcastSystemMessage@20 @16
BroadcastSystemMessageA@20 @17
BroadcastSystemMessageW@20 @18
CallMsgFilter@8 @19
CallMsgFilterA@8 @20
CallMsgFilterW@8 @21
CallNextHookEx@16 @22
CallWindowProcA@20 @23
CallWindowProcW@20 @24
CascadeChildWindows@8 @25
CascadeWindows@20 @26
ChangeClipboardChain@8 @27
ChangeDisplaySettingsA@8 @28
ChangeDisplaySettingsExA@20 @29
ChangeDisplaySettingsExW@20 @30
ChangeDisplaySettingsW@8 @31
ChangeMenuA@20 @32
ChangeMenuW@20 @33
CharLowerA@4 @34
CharLowerBuffA@8 @35
CharLowerBuffW@8 @36
CharLowerW@4 @37
CharNextA@4 @38
CharNextExA@12 @39
CharNextW@4 @40
CharPrevA@8 @41
CharPrevExA@16 @42
CharPrevW@8 @43
CharToOemA@8 @44
CharToOemBuffA@12 @45
CharToOemBuffW@12 @46
CharToOemW@8 @47
CharUpperA@4 @48
CharUpperBuffA@8 @49
CharUpperBuffW@8 @50
CharUpperW@4 @51
CheckDlgButton@12 @52
CheckMenuItem@12 @53
CheckMenuRadioItem@20 @54
CheckRadioButton@16 @55
ChildWindowFromPoint@12 @56
ChildWindowFromPointEx@16 @57
CliImmSetHotKey@16 @58
ClientThreadSetup@0 @59
ClientToScreen@8 @60
ClipCursor@4 @61
CloseClipboard@0 @62
CloseDesktop@4 @63
CloseWindow@4 @64
CloseWindowStation@4 @65
CopyAcceleratorTableA@12 @66
CopyAcceleratorTableW@12 @67
CopyIcon@4 @68
CopyImage@20 @69
CopyRect@8 @70
CountClipboardFormats@0 @71
CreateAcceleratorTableA@8 @72
CreateAcceleratorTableW@8 @73
CreateCaret@16 @74
CreateCursor@28 @75
CreateDesktopA@24 @76
CreateDesktopW@24 @77
CreateDialogIndirectParamA@20 @78
CreateDialogIndirectParamAorW@24 @79
CreateDialogIndirectParamW@20 @80
CreateDialogParamA@20 @81
CreateDialogParamW@20 @82
CreateIcon@28 @83
CreateIconFromResource@16 @84
CreateIconFromResourceEx@28 @85
CreateIconIndirect@4 @86
CreateMDIWindowA@40 @87
CreateMDIWindowW@40 @88
CreateMenu@0 @89
CreatePopupMenu@0 @90
CreateWindowExA@48 @91
CreateWindowExW@48 @92
CreateWindowStationA@16 @93
CreateWindowStationW@16 @94
CtxInitUser32@0 @95
DdeAbandonTransaction@12 @96
DdeAccessData@8 @97
DdeAddData@16 @98
DdeClientTransaction@32 @99
DdeCmpStringHandles@8 @100
DdeConnect@16 @101
DdeConnectList@20 @102
DdeCreateDataHandle@28 @103
DdeCreateStringHandleA@12 @104
DdeCreateStringHandleW@12 @105
DdeDisconnect@4 @106
DdeDisconnectList@4 @107
DdeEnableCallback@12 @108
DdeFreeDataHandle@4 @109
DdeFreeStringHandle@8 @110
DdeGetData@16 @111
DdeGetLastError@4 @112
DdeGetQualityOfService@12 @113
DdeImpersonateClient@4 @114
DdeInitializeA@16 @115
DdeInitializeW@16 @116
DdeKeepStringHandle@8 @117
DdeNameService@16 @118
DdePostAdvise@12 @119
DdeQueryConvInfo@12 @120
DdeQueryNextServer@8 @121
DdeQueryStringA@20 @122
DdeQueryStringW@20 @123
DdeReconnect@4 @124
DdeSetQualityOfService@12 @125
DdeSetUserHandle@12 @126
DdeUnaccessData@4 @127
DdeUninitialize@4 @128
DefDlgProcA@16 @129
DefDlgProcW@16 @130
DefFrameProcA@20 @131
DefFrameProcW@20 @132
DefMDIChildProcA@16 @133
DefMDIChildProcW@16 @134
DefWindowProcA@16 @135
DefWindowProcW@16 @136
DeferWindowPos@32 @137
DeleteMenu@12 @138
DeregisterShellHookWindow@4 @139
DestroyAcceleratorTable@4 @140
DestroyCaret@0 @141
DestroyCursor@4 @142
DestroyIcon@4 @143
DestroyMenu@4 @144
DestroyWindow@4 @145
DeviceEventWorker@20 @146
DialogBoxIndirectParamA@20 @147
DialogBoxIndirectParamAorW@24 @148
DialogBoxIndirectParamW@20 @149
DialogBoxParamA@20 @150
DialogBoxParamW@20 @151
DispatchMessageA@4 @152
DispatchMessageW@4 @153
DlgDirListA@20 @154
DlgDirListComboBoxA@20 @155
DlgDirListComboBoxW@20 @156
DlgDirListW@20 @157
DlgDirSelectComboBoxExA@16 @158
DlgDirSelectComboBoxExW@16 @159
DlgDirSelectExA@16 @160
DlgDirSelectExW@16 @161
DragDetect@12 @162
DragObject@20 @163
DrawAnimatedRects@16 @164
DrawCaption@16 @165
DrawCaptionTempA@28 @166
DrawCaptionTempW@28 @167
DrawEdge@16 @168
DrawFocusRect@8 @169
DrawFrame@16 @170
DrawFrameControl@16 @171
DrawIcon@16 @172
DrawIconEx@36 @173
DrawMenuBar@4 @174
DrawMenuBarTemp@20 @175
DrawStateA@40 @176
DrawStateW@40 @177
DrawTextA@20 @178
DrawTextExA@24 @179
DrawTextExW@24 @180
DrawTextW@20 @181
EditWndProc@16 @182
EmptyClipboard@0 @183
EnableMenuItem@12 @184
EnableScrollBar@12 @185
EnableWindow@8 @186
EndDeferWindowPos@4 @187
EndDialog@8 @188
EndMenu@0 @189
EndPaint@8 @190
EndTask@12 @191
EnumChildWindows@12 @192
EnumClipboardFormats@4 @193
EnumDesktopWindows@12 @194
EnumDesktopsA@12 @195
EnumDesktopsW@12 @196
EnumDisplayDevicesA@16 @197
EnumDisplayDevicesW@16 @198
EnumDisplayMonitors@16 @199
大熊猫侯佩 2010-01-13
  • 打赏
  • 举报
回复
hi,好久不见!
如果你的MASM要和VC联编的话,可以将这些API放在VC中作为导出函数,在MASM引用。
不知这样是否可以?另外按说不会出现这种问题的...用新版的MASM也是如此吗?

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧