问题标签 [getprocaddress]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 不适用于 Windows 7,但它适用于 Windows 8 dll
我有两个DLL文件,A和B。
A 需要 B 用于 setWindowsHookEx()。
我用:
当我尝试在 Windows 7 上运行我的程序时,GetProcAddress(hDll, "GetMsgProc")
返回错误。
GetLastError()
返回 122,但我认为这不是一个好的错误代码。
当我在 Windows 8 上运行我的程序时,一切正常。
当我更改函数调用时GetProcAddress(hDll, "foo")
typedef void(*foo)();
只是创建消息框
一切都适用于 Windows 7 和 Windows 8。
我认为我的问题是__stdcal
l,但我没有找到解决方案。
DLL 文件 A
DLL 文件 B
我在 Windows 8 64 位和 Windows 7 32 位上运行我的程序。
我运行Dependency Walker并找到了 name GetProcAddress(hDll, "_GetMsgProc@12");
,但我的程序无法运行。
c++ - GetProcAddress 函数在整个类中的使用
我正在使用由其他程序员提供的 DLL,该 DLL 提供了我想在我的应用程序中使用的某些功能。只要我在同一个 .cpp 文件中使用导入的函数,下面的代码就可以工作——但不是在所有单独的类中都有效:
主文件
主文件
当我在 main.cpp 中使用 _SendChat 时,它可以工作并执行它应该做的事情,但是一旦我在以下类中使用它,它就不起作用:
客户端.h
客户端.cpp
这是有道理的,因为在 client.cpp 中的任何地方都没有 _SendChat 的定义,除了我尝试寻找如何解决这个问题,但我几乎什么也没找到——这让我觉得我看起来不对。
欢迎任何提示。
winapi - 当名称可能被修饰时使用 GetProcAddress
GetProcAddress()
在 32 位 DLL 上使用的正确方法是什么?在win32上,共有三种调用约定,cdecl、stdcall和fastcall。如果 DLL 中的函数是foo
他们将通过以下方式装饰名称_foo
,_foo@N
并且@foo@N
.
但是如果 dll 的作者使用了 .def 文件,那么导出的名称将被更改为只是“foo”而没有任何修饰。
这给我带来了麻烦,因为如果我想foo
从使用 stdcall 的 dll 加载,我应该使用修饰名称:
或未装饰的:
? 我应该猜吗?我查看了许多 32 位 DLL 文件(stdcall 和 cdecl),它们似乎都导出了未修饰的名称。但是你能假设情况总是如此吗?
c# - GetProcAdress 返回 0
当我调用这个 CallExport 函数时,GetProcAdress(module, "Main") 返回 0,我不知道为什么。之前的 LoadLibraryEx 工作并返回一个有效的 IntPtr。
在我的 Dll 代码中,我有:
似乎 GetProcAdress(module, "Main") 在我的 dll 中找不到“Main”函数,即使有一个。
c++ - 使用 32 位应用程序从 64 位 kernel32.dll 获取函数地址
我有在Windows (WOW64)32bit
上运行的应用程序。64bit
我需要知道几个WinAPI
函数的地址kernel32.dll
。
A 可以很容易地在32bit
kernel32.dll
:中获得函数的地址,GetProcAddress
效果很好。
但是 Windows 提供不同kernel32.dll
的应用程序(32bit
或64bit
映射到应用程序地址空间中不同地址的库 - 我不确切知道)。而且app中的WinAPI
函数地址和32bit
app中的不一样64bit
。
如何通过64bit
kernel32.dll
使用32bit
应用程序获取功能的地址?我不想64bit
为了知道所需功能的地址而启动单独的进程。
c++ - 调用dll方法时如何解决访问冲突写入位置
我正在使用 GetProcAddress 来访问标准的 Isapi 过滤器 DLL 方法 - GetFilterVersion 方法,它采用指向 HTTP_FILTER_VERSION 结构的指针。
https://msdn.microsoft.com/en-us/library/ms525822(v=vs.90).aspx
https://msdn.microsoft.com/en-us/library/ms525465(v=vs.90).aspx
我已经针对我编写的工作 Isapi 过滤器测试了代码,它工作正常。我针对来自供应商的 Isapi 过滤器调试代码(我无权访问源代码或 dll 本身之外的任何内容)并且我得到异常“访问冲突写入位置”。可能是什么问题?(两个 Isapi 过滤器都在 IIS 中工作。)
c++ - C++ GetProcAddress 不工作
我有以下代码:
此代码适用于例如 user32.dll 和 MessageBoxA 但不是我自己的 dll ......
我如何使它也适用于我自己的 dll?提前致谢。
c++ - 调用另一个 DLL 花费的时间超出了应有的时间
我已将以下功能添加到现有的本机 C++ 应用程序中:
- 通过 LoadLibraryA(...) 加载第 3 方 DLL
- 通过 GetProcAddress(...) 从 DLL 中获取函数指针
- 该函数被调用
虽然这基本上可行(该函数被称为 alight 并产生预期的输出),但有一个主要问题:函数调用(在 3. 中)非常慢。执行时间超过 300 毫秒(!),而它应该小于 1 毫秒。
所以我创建了一个新的空白 C++ 应用程序并复制了代码。因此,步骤 1 到 3 的执行方式与其他应用程序完全相同。该函数执行相同的操作并产生相同的结果。但执行要快得多:正如预期的那样,不到 1 毫秒。
我还做了一些观察:
- 两个结果都是 100% 可重复的。
- 两个应用程序似乎具有相同的编译器/链接器设置。
- 线程/性能问题似乎不是问题,因为在这两个应用程序中,代码都是在 CPU 使用率非常低的情况下在主线程上执行的(其他情况不多)。结果也是可重复的,这排除了这些时间问题。
- 在我的第一个应用程序中,对 DLL 的每次调用至少需要 300 毫秒,而在另一个应用程序中则很快。因此,行为不限于单个功能。
- 如果我使用调试或发布版本没有区别。
- 应用程序和第 3 方 DLL 都是 32 位的。
所以现在我正在寻找一个想法,是什么导致两个应用程序在做完全相同的事情时表现得如此不同。
c++ - 动态调用成员方法c++
我知道这已经讨论过几次了,但我的情况有点不同。
我有一个导出一些类的第三方 dll。不幸的是,头文件不可用。仍然可以调用导出的函数。但我无法绕过传递正确的“this”指针(在 RCX 寄存器中传递)。
首先我使用 dumpbin /exports 来提取函数名(名称因第三方库而改变,函数名是保密的)。
现在,API 允许我注册接收指向 ThirdPartyNamespace::ThirdPartyClass 的指针的回调(只有 ThirdPartyClass 的前向声明)。
在这里,我如何尝试调用 ThirdPartyNamespace::ThirdPartyClass::GetId():
一切看起来都很好(即如果我介入 - 我确实进入了 ThirdPartyClass::GetId 方法。但是 this 指针不好。虽然 ptr 很好,如果在调试器中我手动将 rcx 更改为 ptr - 它工作正常。但是编译器由于某种原因没有通过 ptr。这是反汇编:
在执行这些命令之前,rsi 包含指向 ThirdPartyClass 对象(即 ptr)的指针,但不是直接将它传递给 rcx,而是对其执行一些算术运算,结果,这个指针完全错误。
一些我不明白为什么编译器会这样做的痕迹,因为它最终会调用非虚拟函数 ThirdPartyClass::GetId():
在我看来,它应该像
如果我在调用 qword ptr [rdi+20h] 之前将 rcx 设置为等于 rsi,它会返回我的预期值。
我做错了什么吗?提前致谢。
c++ - C++ GetProcAddress 64bit 返回 32bit 地址
我一直在寻找一段时间,并没有找到以下问题的合适答案:
我在 dll 中将 dll 注入目标进程,我尝试调用导出的函数,该函数的地址我想接收我的调用 GetProcAddress,如下所示:
调用成功,我检索到地址并且 GetLastError() 显然是 0。
但它只是地址的 16 字节十六进制表示(如“0xAB4285B9”),但我需要它用于 32 字节十六进制表示,因为我缺少前 8 个字节(例如,7FF8,完整地址将是“0x7FF8AB4285B9 ")
它只是一个演示/格式问题还是我需要调用另一个函数来获得我想要的?
我显示如下信息:
我很感激任何帮助。
抱歉,非代码格式,我在这里使用手机的网络浏览器。
格雷茨