我有一个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#.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) 我有一个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) 使用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) 我有一个Visual Studio 2008 C++应用程序,我正在为标准容器使用自定义分配器,以便它们的内存来自内存映射文件而不是堆.此分配器用于4种不同的用例:
std::vector< SomeType, MyAllocator< SomeType > > foo;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没有足够的空间,则有其中一个.
用于分配器的算法如下:
不幸的是,一段时间后,第2步可能变得非常缓慢.随着对象的复制和临时变量的破坏,我得到了很多碎片.这导致在存储器结构内进行大量深度搜索.碎片存在问题,因为我使用的内存有限(请参阅下面的注释)
任何人都可以建议改进这种算法来加速这个过程吗?我需要两个单独的算法(1个用于固定大小的分配,1个用于字符串分配器)?
注意:对于那些需要理由的人:我在Windows Mobile中使用此算法,其中Heap有32MB的进程槽限制.所以,通常std::allocator不会削减它.我需要将分配放在1GB大内存区域中以获得足够的空间,这就是它的作用.
我可以在UEFI环境中构建和手动执行 EFI应用程序.但是,我想让我的应用程序在启动时自动执行.
有没有办法告诉引导加载程序执行此操作,还是需要将我的应用程序转换为驱动程序以使其自动执行?在FDF,DEC,DSC或INF文件中是否有一些条目我不见了?
我在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;我会收到类似的错误,并且输出在所有浏览器中都是实时的.它是否与打印异常的方式有关?
我使用的是WinDBG 6.12.0002.633 X86.
我遇到命令行调试器CDB的问题,并没有显示k与kL命令的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,的结果k及kL是相同的:
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那样显示命令的代码行?
我有一个使用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
我有一个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)