Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在MS VC++;使用我自己的实现的项目(名称和参数集相同)?_C++_Winapi_Visual C++ - Fatal编程技术网

C++ 如何在MS VC++;使用我自己的实现的项目(名称和参数集相同)?

C++ 如何在MS VC++;使用我自己的实现的项目(名称和参数集相同)?,c++,winapi,visual-c++,C++,Winapi,Visual C++,我需要替换的所有WinAPI调用 创建文件 读取文件 SetFilePointer 握把 使用我自己的实现(通过蓝牙使用低级文件读取)。 代码,其中的功能将被取代,是视频文件播放器,它已经与常规的hdd文件。 还需要的是,如果视频播放器输入中的文件是常规HDD文件,视频播放器仍然可以播放HDD中的文件 这类任务的最佳实践是什么?我不认为这是最佳实践,但如果您将其放在一个包含文件中,该文件包含在您要更改的函数调用的所有位置,则它应该会起作用: #define CreateFile MyCrea

我需要替换的所有WinAPI调用

  • 创建文件
  • 读取文件
  • SetFilePointer
  • 握把
使用我自己的实现(通过蓝牙使用低级文件读取)。 代码,其中的功能将被取代,是视频文件播放器,它已经与常规的hdd文件。 还需要的是,如果视频播放器输入中的文件是常规HDD文件,视频播放器仍然可以播放HDD中的文件


这类任务的最佳实践是什么?

我不认为这是最佳实践,但如果您将其放在一个包含文件中,该文件包含在您要更改的函数调用的所有位置,则它应该会起作用:

#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的技术,但要注意这是一种维护恐惧

如果无法编辑代码,可以修补导入表以将调用重定向到自己的代码。有关此技术的说明,请参见-搜索标题为“通过更改导入地址表进行间谍活动”的部分


这是危险的,但如果你小心,你可以让它工作。另外,请检查一下,它也会做同样的事情,但不需要您去处理实际的补丁。

我建议您遵循以下步骤:

  • 编写一组包装函数,例如MyCreateFile、MyReadFile等,它们最初只调用相应的API并传递相同的参数,不做修改
  • 使用文本编辑器搜索对原始API的所有调用,并用对新包装函数的调用替换这些调用
  • 测试应用程序是否仍然正常工作
  • 修改包装器函数以适合您自己的用途
  • 请注意,CreateFile是一个宏,它可以扩展为CreateFileW或CreateFileA,具体取决于是否定义了UNICODE。考虑使用LPCTSTR,这样您的应用程序就可以构建为ANSI或Unicode。
    请不要使用#define,正如其他回答中所建议的那样,因为这只会导致维护问题,正如Maximilian正确指出的那样,这不是最佳做法。

    我建议您遵循以下步骤:

  • 编写一组包装函数,例如MyCreateFile、MyReadFile等,它们最初只调用相应的API并传递相同的参数,不做修改
  • 使用文本编辑器搜索对原始API的所有调用,并用对新包装函数的调用替换这些调用
  • 测试应用程序是否仍然正常工作
  • 修改包装器函数以适合您自己的用途
  • 请注意,CreateFile是一个宏,它可以扩展为CreateFileW或CreateFileA,具体取决于是否定义了UNICODE。考虑使用LPCTSTR,这样您的应用程序就可以构建为ANSI或Unicode。
    请不要使用#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的建议去做。实际上,你