小编LCC*_*LCC的帖子

任意指令指针是否驻留在特定函数中?

我有一个非常难以解决的问题:假设我有一个任意指令指针.我需要找出该指令指针是否驻留在特定函数中(让我们称之为"Foo").

一种方法是尝试找到函数的开始和结束边界,并查看IP是否位于其中.起始界很容易找到:

    void *start = &Foo;

问题是,我不知道如何获取函数的结束地址(或函数的"长",以汇编的字节为单位).

有没有人有任何想法如何获得一个函数的"长度",或完全不同的方式这样做?

假设函数中没有SEH或C++异常处理.另请注意,我在win32平台上,并且可以完全访问win32 api.

c c++

2
推荐指数
1
解决办法
443
查看次数

Arm(thumb-2)组装模拟器?

拇指2组装的模拟器有这样的东西吗?我想编写简单的ARM Thumb-2汇编程序并测试它们而不需要使用实际的ARM设备,所以我唯一的选择是仿真.

我的目标是在thumb-2汇编中实现相当数量的算法作为学习练习.我甚至不需要模拟其他硬件(例如io/display/etc).只是能够运行thumb-2程序集(编译与否)并查看结果(即,基本上能够调试程序并在程序完成后查看模拟内存的内容).

有这样的事情存在,还是我抓住稻草?

arm emulation

2
推荐指数
1
解决办法
2781
查看次数

在等待锁定期间正确睡觉的方法

在我的win8(winrt,c#)应用程序中,我需要调用一个具有非常特定限制的Web API:每2秒不再调用一次Web服务.

我试图强制执行此限制,如下所示:

class Client
{
    const int Delay = 2000;
    HttpClient m_client = new HttpClient();
    int m_ticks = 0;

    public async Task<string> Get(string url)
    {
        // Multiple threads could be calling, I need to protect access to m_ticks:
        string result = null;
        lock (this)
        {
            int ticks = Environment.TickCount - m_ticks;
            if (ticks < Delay)
                await Task.Delay(Delay - ticks);

            result = await m_client.GetStringAsync(url);

            m_ticks = Environment.TickCount;
        }

        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

这让我陷入了困境:

  1. 我不能在锁中使用await语句.
  2. 我不能回到WebClient + Thread.Sleep(避免异步废话)之类的东西,因为它在win8客户端配置文件中不存在.
  3. 我不能避免这种方法是"异步",因为那样我就不能在没有异步函数的情况下等待GetStringAsync或Task.Delay.
  4. 我无法避免锁定,因为多个线程可能正在调用此函数,我需要同步访问m_ticks.

我怎么会这样写这样的东西?

c# asynchronous httpclient async-await windows-runtime

2
推荐指数
1
解决办法
1899
查看次数

用不同的键对std :: map进行排序?

我正在尝试使用STL来解决以下问题(如果我不需要,我不想实现自己的数据结构).我想出了一个有效的实现,但是我希望有更快的东西...或者我有哪些代码可以做到最好?

我有一个大型数据集,其中每个条目包含两个项目:一个键和一个大小.数据集中有多个条目具有相同的密钥.我需要知道的是:对于每个密钥,数据集中有多少个密钥,每个密钥的总大小是多少.例如,给定此数据集(键,大小):

(1, 3)
(3, 27)
(7, 7)
(3, 2)
(1, 1)
Run Code Online (Sandbox Code Playgroud)

我想生成此输出,按大小升序排序:

Key 1:  Size 4, Count 2
Key 7:  Size 7, Count 1
Key 3:  Size 29, Count 2
Run Code Online (Sandbox Code Playgroud)

由于数据集完全未排序,我首先需要聚合键来计算它们并总结大小.然后我需要通过总大小来求助该数据结构以产生最终输出.这是我用std :: map和std :: vector完成任务的代码:

struct Node
{
    int Size;
    int Count;

    Node()
        : Size(0), Count(0)
    {
    }

    Node(int size)
        : Size(size), Count(1)
    {
    }
};

void map_insert(std::map<int, Node> &map, int key, int size)
{
    std::map<int, Node>::iterator itr = map.find(key);

    if (itr != map.end())
    {
        itr->second.Count++;
        itr->second.Size += size; …
Run Code Online (Sandbox Code Playgroud)

c++ stl

1
推荐指数
1
解决办法
4505
查看次数

导出使用托管句柄的类?

我正在尝试在C++/CLI中围绕.Net库创建一个本机包装器,以便常规C++代码可以使用它.对于这个例子,假设这是我试图包装的C#代码:

class Foo
{
    public Bar GetBar() {...}
    public string SomeProperty { get; set; }
}

class Bar
{
    public void Baz() {...}
}
Run Code Online (Sandbox Code Playgroud)

我基本上是在C++/CLI(dll项目)中大致尝试这样做:

class __declspec(dllexport) NativeFoo
{
public:
    NativeBar GetBar();
    std::string GetName();
    void SetName(const std::string &value);

private:
    Foo ^m_foo;
};

class __declspec(dllexport) NativeBar
{
    friend class NativeFoo;
public:
    void Baz();

private:
    Bar(Bar ^bar);

    Bar ^m_bar;
};
Run Code Online (Sandbox Code Playgroud)

这样,C++库可以链接到这个,使用NativeFoo就好像它是一个普通的C++类.在内部,NativeFoo将转换参数以将实现传递给m_foo,将任何管理的内容编组回本机表示并将其返回给其调用者...

但是,我遇到的问题是我不能拥有非托管类的托管成员:

error C3265: cannot declare a managed 'm_bar' in an unmanaged 'NativeFoo'
Run Code Online (Sandbox Code Playgroud)

类似地,我不能将NativeFoo标记为"ref"(作为托管类本身)因为那时我无法导出它:

C3386: 'NativeFoo' : __declspec(dllexport)/__declspec(dllimport) cannot be applied to …
Run Code Online (Sandbox Code Playgroud)

c++-cli

1
推荐指数
1
解决办法
3507
查看次数

标签 统计

c++ ×2

arm ×1

async-await ×1

asynchronous ×1

c ×1

c# ×1

c++-cli ×1

emulation ×1

httpclient ×1

stl ×1

windows-runtime ×1