C++ 如何在MS VC++;使用我自己的实现的项目(名称和参数集相同)?
我需要替换的所有WinAPI调用C++ 如何在MS VC++;使用我自己的实现的项目(名称和参数集相同)?,c++,winapi,visual-c++,C++,Winapi,Visual C++,我需要替换的所有WinAPI调用 创建文件 读取文件 SetFilePointer 握把 使用我自己的实现(通过蓝牙使用低级文件读取)。 代码,其中的功能将被取代,是视频文件播放器,它已经与常规的hdd文件。 还需要的是,如果视频播放器输入中的文件是常规HDD文件,视频播放器仍然可以播放HDD中的文件 这类任务的最佳实践是什么?我不认为这是最佳实践,但如果您将其放在一个包含文件中,该文件包含在您要更改的函数调用的所有位置,则它应该会起作用: #define CreateFile MyCrea
- 创建文件
- 读取文件
- SetFilePointer
- 握把
这类任务的最佳实践是什么?我不认为这是最佳实践,但如果您将其放在一个包含文件中,该文件包含在您要更改的函数调用的所有位置,则它应该会起作用:
#define CreateFile MyCreateFile
HRESULT MyCreateFile(whatever the params are);
MyCreateFile的实现如下所示:
#undef CreateFile
HRESULT MyCreateFile(NobodyCanRememberParamListsLikeThat params)
{
if (InputIsNormalFile())
CreateFile(params);
else
// do your thing
}
基本上,每个CreateFile调用都是MyCreateFile调用,您可以在其中决定是需要使用自己的实现还是原始实现
免责声明:我认为这样做很难看,我不会这么做。我宁愿搜索并替换所有事件或其他内容。我不认为这是最佳做法,但如果您将其放入包含文件中,该文件包含在您要更改的函数调用的所有位置,则它应该会起作用:
#define CreateFile MyCreateFile
HRESULT MyCreateFile(whatever the params are);
MyCreateFile的实现如下所示:
#undef CreateFile
HRESULT MyCreateFile(NobodyCanRememberParamListsLikeThat params)
{
if (InputIsNormalFile())
CreateFile(params);
else
// do your thing
}
基本上,每个CreateFile调用都是MyCreateFile调用,您可以在其中决定是需要使用自己的实现还是原始实现
免责声明:我认为这样做很难看,我不会这么做。我宁愿搜索和替换所有的发生或某事。 如果你试图拦截另一个应用程序对这些API的调用,请考虑.< /p> 如果你试图拦截另一个应用程序对这些API的调用,请考虑.< /p> < p>如果你可以编辑代码,您只需重新编写它,就可以使用一个定制的API来实现您想要的功能。如果做不到这一点,可以使用Maximilian的技术,但要注意这是一种维护恐惧 如果无法编辑代码,可以修补导入表以将调用重定向到自己的代码。有关此技术的说明,请参见-搜索标题为“通过更改导入地址表进行间谍活动”的部分
这是危险的,但如果你小心,你可以让它工作。也可以查看,它做同样的事情,但不需要您去处理实际的补丁。如果您可以编辑代码,您只需重新编写代码,使用自定义API即可。如果做不到这一点,可以使用Maximilian的技术,但要注意这是一种维护恐惧 如果无法编辑代码,可以修补导入表以将调用重定向到自己的代码。有关此技术的说明,请参见-搜索标题为“通过更改导入地址表进行间谍活动”的部分
这是危险的,但如果你小心,你可以让它工作。另外,请检查一下,它也会做同样的事情,但不需要您去处理实际的补丁。我建议您遵循以下步骤:
请不要使用#define,正如其他回答中所建议的那样,因为这只会导致维护问题,正如Maximilian正确指出的那样,这不是最佳做法。我建议您遵循以下步骤:
请不要使用#define,正如其他回复中所建议的那样,因为这只会导致维护问题,正如Maximilian正确指出的,这不是最佳实践。您可以在自定义名称空间中编写新函数。e、 g
namespace Bluetooth
{
void CreateFile(/*params*/);
void etc...
}
然后,在代码中,唯一需要更改的是:
if (::CreateFile(...))
{
}
到
轻松点!:) 您可以在自定义名称空间中编写新函数。e、 g
namespace Bluetooth
{
void CreateFile(/*params*/);
void etc...
}
然后,在代码中,唯一需要更改的是:
if (::CreateFile(...))
{
}
到
轻松点!:) 如果您真的想劫持API,请查看(L-GPL)。如果您真的想劫持API,请查看(L-GPL)。谢谢!您是否认为编写一些类会更好,其中将定义MyCreateFile()方法,然后在代码中Ctrl-H所有CreateFile调用?是的,我建议您这样做。基本上按照ChrisN的建议去做。实际上,编写这样的类可能会使您受益,尤其是当您的函数在读取或写入文件时需要维护任何其他状态/数据时。谢谢!你认为,编写一些类会更好吗,在这些类中定义MyCreateFile()方法,然后在代码中Ctrl-H所有CreateFile调用?是的,我建议你这样做。基本上就是按照ChrisN的建议去做。实际上,你