我看到一些相关的问题已经问过,但他们是不是太先进了我掌握的或缺乏一步一步的指导,从开始到结束(最终被内幕交谈,他们自己的实验结果)。确定这就是,鉴于这个简单的程序:

#include <stdio.h>
#include <string.h>

int main()
{
    FILE * f;
    char buffer[100];

    memset(buffer, 0, 100);

    fun();

    f = fopen("main.cpp", "r");
    fread(buffer, 1, 99, f);
    printf(buffer);
    fclose(f);

    return 0;
}

什么,它基本上是印刷本身(假设的文件名 main.cpp).

的问题

我怎么可以拥有它打印另一个文件,说 foobar.txt 无需修改源码?它有什么用运行,它通过VS是,加强通过的职能和劫持文件指针的权利之前 fread() 被称为。没有必要担心泄漏通过调用资源 fclose().

我尝试简单 f = fopen("foobar.txt", "r") 这给了

CXX0017: Error: symbol "fopen" not found

任何想法?

编辑

我发现出的解决方案的意外上 调试Mozilla在Windows常见问题.正确命令投入立即窗口

f = {,,MSVCR100D}fopen("foo.txt", "r")

然而,它并没有真正回答这个问题:

  • 我还是不明白什么会在这里。
  • 如何有系统地找出 {,,MSVCR100D} 部分对于任何给定的方法?我知道MSVCR版本的变化。我怎么发现的?
  • 任何人都可以解释的大括号法,特别是那些是什么两个逗号做的吗?还有更多隐藏的宝石,使用这种语法?
有帮助吗?

解决方案

该卷括号法是VS 下文员, ,这主要是破阐述的链接(或至少,几乎没有一个隐藏的宝石).它是任何地方使用的VS表达的评价发动机需要解决的功能在运行时,例如评估的化合物表达的看窗口,设置断点,或者(如你所见证)在立即命令的窗口。

第3个参数是二进制其中包括执行功能你想要呼叫。用CRT功能,例如fopen,通常数额-

MSVCR[VS版本][D].dll

(我似乎回想一下延长是必要的,但也许这就改变了在VS2010).'D'表示调试dll版本。VS版数码为:VS2005->8,VS2008->9,VS2010->10.

还注意到,评价发动机已 各种其他的陷阱 要提防。

其他提示

补充地平线公司的良好答案,这是一种方法,我发现,有系统地找出哪些模块的功能呼叫。(即的 MSVCR100D 部分)。

  • 步骤通过调试寻找一个实例功能你想要呼叫。(在这种情况下,我一直在寻找 fopen);
  • 当你找到它,它通过按F11。
  • 右击和选择显示的拆卸
  • 你可以找到地址的当前执行的指令。(击周围的观察选项,以切换如果不是所示)
  • 开调试模块窗口(Alt-按Ctrl+U)
  • 看起来通过的清单的装模块的地址范围涵盖目前指示的地址。Bam,你已经找到了该模块的名称。

我相信你可以用这种方法找到模块名为任何类。这可能是有用的,当例如你是审查一个大型代码基地和你想要援引一些任意的类的方法在飞行中的"即时"窗口。你可能也创建类的实例的飞行通过调用的构造自己。

现在不是用C++一的母语?我们几乎觉得就像在一个管理、脚本的环境在这里:P

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top