问题标签 [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.

0 投票
1 回答
209 浏览

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。

我认为我的问题是__stdcall,但我没有找到解决方案。

DLL 文件 A

DLL 文件 B

我在 Windows 8 64 位和 Windows 7 32 位上运行我的程序。

我运行Dependency Walker并找到了 name GetProcAddress(hDll, "_GetMsgProc@12");,但我的程序无法运行。

0 投票
2 回答
743 浏览

c++ - GetProcAddress 函数在整个类中的使用

我正在使用由其他程序员提供的 DLL,该 DLL 提供了我想在我的应用程序中使用的某些功能。只要我在同一个 .cpp 文件中使用导入的函数,下面的代码就可以工作——但不是在所有单独的类中都有效:

主文件

主文件

当我在 main.cpp 中使用 _SendChat 时,它可以工作并执行它应该做的事情,但是一旦我在以下类中使用它,它就不起作用:

客户端.h

客户端.cpp

这是有道理的,因为在 client.cpp 中的任何地方都没有 _SendChat 的定义,除了我尝试寻找如何解决这个问题,但我几乎什么也没找到——这让我觉得我看起来不对。

欢迎任何提示。

0 投票
2 回答
1240 浏览

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),它们似乎都导出了未修饰的名称。但是你能假设情况总是如此吗?

0 投票
0 回答
142 浏览

c# - GetProcAdress 返回 0

当我调用这个 CallExport 函数时,GetProcAdress(module, "Main") 返回 0,我不知道为什么。之前的 LoadLibraryEx 工作并返回一个有效的 IntPtr。

在我的 Dll 代码中,我有:

似乎 GetProcAdress(module, "Main") 在我的 dll 中找不到“Main”函数,即使有一个。

0 投票
1 回答
1351 浏览

c++ - 使用 32 位应用程序从 64 位 kernel32.dll 获取函数地址

我有在Windows (WOW64)32bit上运行的应用程序。64bit我需要知道几个WinAPI函数的地址kernel32.dll

A 可以很容易地在32bit kernel32.dll:中获得函数的地址,GetProcAddress效果很好。

但是 Windows 提供不同kernel32.dll的应用程序(32bit64bit映射到应用程序地址空间中不同地址的库 - 我不确切知道)。而且app中的WinAPI函数地址和32bitapp中的不一样64bit

如何通过64bit kernel32.dll使用32bit应用程序获取功能的地址?我不想64bit为了知道所需功能的地址而启动单独的进程。

0 投票
2 回答
1087 浏览

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 中工作。)

0 投票
1 回答
1383 浏览

c++ - C++ GetProcAddress 不工作

我有以下代码:

此代码适用于例如 user32.dll 和 MessageBoxA 但不是我自己的 dll ......

我如何使它也适用于我自己的 dll?提前致谢。

0 投票
0 回答
353 浏览

c++ - 调用另一个 DLL 花费的时间超出了应有的时间

我已将以下功能添加到现有的本机 C++ 应用程序中:

  1. 通过 LoadLibraryA(...) 加载第 3 方 DLL
  2. 通过 GetProcAddress(...) 从 DLL 中获取函数指针
  3. 该函数被调用

虽然这基本上可行(该函数被称为 alight 并产生预期的输出),但有一个主要问题:函数调用(在 3. 中)非常慢。执行时间超过 300 毫秒(!),而它应该小于 1 毫秒。

所以我创建了一个新的空白 C++ 应用程序并复制了代码。因此,步骤 1 到 3 的执行方式与其他应用程序完全相同。该函数执行相同的操作并产生相同的结果。但执行要快得多:正如预期的那样,不到 1 毫秒。

我还做了一些观察:

  • 两个结果都是 100% 可重复的。
  • 两个应用程序似乎具有相同的编译器/链接器设置。
  • 线程/性能问题似乎不是问题,因为在这两个应用程序中,代码都是在 CPU 使用率非常低的情况下在主线程上执行的(其他情况不多)。结果也是可重复的,这排除了这些时间问题。
  • 在我的第一个应用程序中,对 DLL 的每次调用至少需要 300 毫秒,而在另一个应用程序中则很快。因此,行为不限于单个功能。
  • 如果我使用调试或发布版本没有区别。
  • 应用程序和第 3 方 DLL 都是 32 位的。

所以现在我正在寻找一个想法,是什么导致两个应用程序在做完全相同的事情时表现得如此不同。

0 投票
1 回答
368 浏览

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,它会返回我的预期值。

我做错了什么吗?提前致谢。

0 投票
1 回答
1987 浏览

c++ - C++ GetProcAddress 64bit 返回 32bit 地址

我一直在寻找一段时间,并没有找到以下问题的合适答案:

我在 dll 中将 dll 注入目标进程,我尝试调用导出的函数,该函数的地址我想接收我的调用 GetProcAddress,如下所示:

调用成功,我检索到地址并且 GetLastError() 显然是 0。

但它只是地址的 16 字节十六进制表示(如“0xAB4285B9”),但我需要它用于 32 字节十六进制表示,因为我缺少前 8 个字节(例如,7FF8,完整地址将是“0x7FF8AB4285B9 ")

它只是一个演示/格式问题还是我需要调用另一个函数来获得我想要的?

我显示如下信息:

我很感激任何帮助。

抱歉,非代码格式,我在这里使用手机的网络浏览器。

格雷茨