小编Pau*_*ulH的帖子

获取从本机dll到c#应用程序的结构数组

我有一个C#.NET 2.0 CF项目,我需要在本机C++ DLL中调用一个方法.此本机方法返回一个类型的数组TableEntry.在调用本机方法时,我不知道数组的大小.

如何从原生DLL到C#项目获取表?以下是我现在所拥有的.

// in C# .NET 2.0 CF project
[StructLayout(LayoutKind.Sequential)]
public struct TableEntry
{
    [MarshalAs(UnmanagedType.LPWStr)] public string description;
    public int item;
    public int another_item;
    public IntPtr some_data;
}

[DllImport("MyDll.dll", 
    CallingConvention = CallingConvention.Winapi, 
    CharSet = CharSet.Auto)]
public static extern bool GetTable(ref TableEntry[] table);

SomeFunction()
{
    TableEntry[] table = null;
    bool success = GetTable( ref table );
    // at this point, the table is empty
}


// In Native C++ DLL
std::vector< TABLE_ENTRY > global_dll_table;
extern "C" …
Run Code Online (Sandbox Code Playgroud)

c# pinvoke

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

将作为ICollection <>导出的List <>序列化为XML

我有一个C#.NET 3.5应用程序,我想序列化一个包含List<>XML 的类.我的班级看起来像这样:

[XmlRoot("Foo")]
class Foo
{
    private List<Bar> bar_ = new List<Bar>();

    private string something_ = "My String";

    [XmlElement("Something")]
    public string Something { get { return something_; } }

    [XmlElement("Bar")]
    public ICollection<Bar> Bars
    {
        get { return bar_; }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我像这样填充它:

Bar b1 = new Bar();
// populate b1 with interesting data
Bar b2 = new Bar();
// populate b2 with interesting data

Foo f = new Foo();
f.Bars.Add(b1);
f.Bars.Add(b2);
Run Code Online (Sandbox Code Playgroud)

然后像这样序列化它:

using (System.IO.TextWriter textWriter = new …
Run Code Online (Sandbox Code Playgroud)

c# xml xml-serialization c#-3.0

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

切片DLL句柄类

我有一个Visual Studio 2008 C++项目,我正在创建一个带有C接口的DLL.我定义了两种类型的回调函数:常规函数和扩展函数,它们提供了额外的数据.

struct Foo {
    char a[ MAX_A ];
    char b[ MAX_B ];
    char c[ MAX_C ];
};
struct FooEx {
    char a[ MAX_A ];
    char b[ MAX_B ];
    char c[ MAX_C ];
    char d[ MAX_D ];
};
typedef void ( CALLBACK *USERCALLBACK )( const Foo&, DWORD );
typedef void ( CALLBACK *USERCALLBACK_EX )( const FooEx&, DWORD );
Run Code Online (Sandbox Code Playgroud)

我维持一个UserData结构状态.因为我有两种类型的回调,我最终得到两种结构:

struct UserData {
    DWORD user;
    int zoo;
    std::string bar;
    USERCALLBACK callback;
};

struct UserDataEx {
    DWORD user; …
Run Code Online (Sandbox Code Playgroud)

c++ dll

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

如何在UML中表示模板参数的继承?

使用UML,我如何A< Foo >在以下代码中表示?

template< class T > 
class A : public T
{
    /* ... */
};

class Foo { };

A< Foo > a_foo;
Run Code Online (Sandbox Code Playgroud)

这样的事情(为可怜的ascii艺术......和Jon Skeet道歉)是我的第一个猜测,但我怀疑它是不正确的.

            ________________
            |              |
            |              |
            |     Foo      |
            |              |
            |______________|
             /:\  /|\
«bind»(Foo)   :    |
              :    |   .......               
            __:____|___:  T  :
            |          :.....:
            |              |
            |      A       |
            |              |
            |______________|
Run Code Online (Sandbox Code Playgroud)

c++ uml

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

改进分配器算法实现的建议

我有一个Visual Studio 2008 C++应用程序,我正在为标准容器使用自定义分配器,以便它们的内存来自内存映射文件而不是堆.此分配器用于4种不同的用例:

  1. 104字节固定大小的结构 std::vector< SomeType, MyAllocator< SomeType > > foo;
  2. 200字节固定大小的结构
  3. 304字节固定大小的结构
  4. n字节字符串 std::basic_string< char, std::char_traits< char >, MyAllocator< char > > strn;

我需要能够为这些中的每一个分配大约32MB的总和.

分配器使用std::map指向分配大小的指针跟踪内存使用情况.typedef std::map< void*, size_t > SuperBlock;每个SuperBlock代表4MB内存.

std::vector< SuperBlock >如果一个SuperBlock没有足够的空间,则有其中一个.

用于分配器的算法如下:

  1. 对于每个SuperBlock:超级块的末尾是否有空格?把分配放在那里.(快速)
  2. 如果没有,在每个SuperBlock中搜索足够大的空白空间并将分配放在那里.(慢)
  3. 依然没有?分配另一个SuperBlock并将分配放在新SuperBlock的开头.

不幸的是,一段时间后,第2步可能变得非常缓慢.随着对象的复制和临时变量的破坏,我得到了很多碎片.这导致在存储器结构内进行大量深度搜索.碎片存在问题,因为我使用的内存有限(请参阅下面的注释)

任何人都可以建议改进这种算法来加速这个过程吗?我需要两个单独的算法(1个用于固定大小的分配,1个用于字符串分配器)?

注意:对于那些需要理由的人:我在Windows Mobile中使用此算法,其中Heap有32MB的进程槽限制.所以,通常std::allocator不会削减它.我需要将分配放在1GB大内存区域中以获得足够的空间,这就是它的作用.

c++ algorithm allocator

6
推荐指数
2
解决办法
337
查看次数

在引导时自动运行EFI应用程序

我可以在UEFI环境中构建和手动执行 EFI应用程序.但是,我想让我的应用程序在启动时自动执行.

有没有办法告诉引导加载程序执行此操作,还是需要将我的应用程序转换为驱动程序以使其自动执行?在FDF,DEC,DSC或INF文件中是否有一些条目我不见了?

efi uefi

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

打印过程实时输出

我在Windows 7 x64系统上使用PHP 5.3.4和Apache 2.2.17.我希望我的PHP页面能够system实时向用户的浏览器输出调用结果.为此,我output_buffering=Off在php.ini中配置并创建了这段代码:

<?php
ob_implicit_flush(true);
ob_end_flush();
system('ping -n 10 www.google.com');
?>
Run Code Online (Sandbox Code Playgroud)

ping的结果是实时打印的,但是我的页面顶部也出现了PHP诊断错误和callstack:

Notice: ob_end_flush() [ref.outcontrol]: failed to delete and flush buffer. No buffer to delete or flush in index.php on line 3
Run Code Online (Sandbox Code Playgroud)

如何更正或抑制此错误,我需要做什么?

更新 如果我改为ob_end_flush(),$a = 1/0;我会收到类似的错误,并且输出在所有浏览器中都是实时的.它是否与打印异常的方式有关?

php apache

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

CDB没有显示WinDBG为callstacks所做的代码行

我使用的是WinDBG 6.12.0002.633 X86.

我遇到命令行调试器CDB的问题,并没有显示kkL命令的WinDBG相同的结果.

在WinDBG中,该k命令正确显示了callstack的代码行,其中kL命令正确地删除了该信息并仅显示了偏移量.

1:128:armce> k
Child-SP RetAddr  Call Site
761efaf4 78013cdc module_78010000!SomeModule::Foo+0xb4 [bar.cpp @ 268]

1:128:armce> kL
Child-SP RetAddr  Call Site
761efaf4 78013cdc module_78010000!SomeModule::Foo+0xb4
Run Code Online (Sandbox Code Playgroud)

在CDB,的结果kkL是相同的:

1:128:armce> k
Child-SP RetAddr  Call Site
761efaf4 78013cdc module_78010000!SomeModule::Foo+0xb4

1:128:armce> kL
Child-SP RetAddr  Call Site
761efaf4 78013cdc module_78010000!SomeModule::Foo+0xb4
Run Code Online (Sandbox Code Playgroud)

我能做些什么来让CDB k像WinDBG那样显示命令的代码行?

windbg postmortem-debugging

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

获取PostThreadMessage的boost :: thread的ID

我有一个使用Boost 1.47.0的Visual Studio 2008 C++项目,我需要将boost :: thread的本机Windows ID传递给PostThreadMessage.

在Windows Vista和7中,我会这样做:

DWORD thread_id = ::GetThreadId( mythread.native_handle() );
Run Code Online (Sandbox Code Playgroud)

这很好,但我还需要我的应用程序在GetThreadId不存在的XP中工作.

我发现boost:thread将线程ID值存储在boost :: thread :: id的私有数据成员中thread_data.我可以通过做一些讨厌的演员来达到这个目的:

boost::detail::thread_data_base* tdb = *reinterpret_cast< boost::detail::thread_data_base** >( &message_thread.get_id() );
DWORD thread_id = tdb->id;
Run Code Online (Sandbox Code Playgroud)

但是,我开始收到引用临时boost::thread::id对象的编译器警告.

warning C4238: nonstandard extension used : class rvalue used as lvalue
Run Code Online (Sandbox Code Playgroud)

有没有一个好方法来获取ID?看到我需要的数据非常令人沮丧,但却无法实现.

谢谢,PaulH

c++ windows boost boost-thread

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

将字符串解析为c样式字符数组的结构

我有一个Visual Studio 2008 C++项目,我需要将字符串解析为c样式字符数组的结构.这样做最优雅/最有效的方法是什么?

这是我目前的(运作)解决方案:

struct Foo {
    char a[ MAX_A ];
    char b[ MAX_B ];
    char c[ MAX_C ];
    char d[ MAX_D ];
};

Func( const Foo& foo );

std::string input = "abcd@efgh@ijkl@mnop";
std::vector< std::string > parsed;
boost::split( parsed, input, boost::is_any_of( "@" ) );

Foo foo = { 0 };
parsed[ 1 ].copy( foo.a, MAX_A );
parsed[ 2 ].copy( foo.b, MAX_B );
parsed[ 3 ].copy( foo.c, MAX_C );
parsed[ 4 ].copy( foo.d, MAX_D );

Func( foo );
Run Code Online (Sandbox Code Playgroud)

c++ string parsing

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