实际上,我确实理解使用异常的主要优点和缺点.我默认将它们用在我的项目中作为错误处理策略.但现在我正在使用Qt库启动Windows CE项目,我发现Qt创建者拒绝在类层次结构中使用异常.
因此,如果我使用异常,我需要在my/Qt代码边界上小心地将它们转换为错误代码(或某些对象,或者只是吞下).否则,我可以拒绝在我的代码中使用异常并切换到其他策略.
在我的情况下,最好的错误处理策略是什么 - 使用异常或使用错误代码,等等......?您是否有使用Qt开发的经验以及您使用的错误处理策略?
我想向我的NSIS安装程序添加对x64操作系统的支持.安装程序的任务之一是驱动程序安装.我为此任务编写了一个特殊的NSIS插件.此插件使用 Driver Install Frameworks API(DIFxAPI)来安装驱动程序.
问题是这个API在WOW64中不起作用.
有没有办法用NSIS创建x64安装程序?有人解决过与NSIS类似的问题吗?
PS:我现在能看到的唯一解决方案是从安装程序运行另一个应用程序.这将是安装驱动程序的x64可执行文件.但这种方式对我来说似乎有点困难.所以,我对其他解决方案很感兴趣.
关于Windows的C++ GUI工具包有很多问题,但它们主要适用于桌面操作系统版本.
我现在正在为Windows CE 5.0 VGA手持设备启动一个C++项目,并考虑选择哪个GUI库.我有一些在Windows CE项目中使用MFC的经验,但是在SO中提到的MFC存在一些已知的弱点(例如,使用了过时的技术,糟糕的抽象,过度使用C++预处理器等).对于桌面项目,他们主要推荐QT和WTL.同时,MFC具有一些对于嵌入式开发仍然可观的特性.
那么,您如何看待,花一些资源学习新的GUI工具包从MFC切换是否合理,在这种情况下您会推荐哪种工具包?或者MFC仍然是Windows CE嵌入式开发中最重要的?
工具包最重要的特征是:适中的CPU和内存负载,小的运行时大小,良好的面向对象设计,符合良好的现代C++实践,陡峭的学习曲线,开发速度,商业外观,便捷的调试和设计工具.
(项目需要什么:串口通信,线程,图表和图表绘制,ActiveSync通信.)
项目:Java,JNI(C++),Android.
我将通过创建一个托管包装类来管理本机C++对象的生命周期,该类包含一个指向本机对象的指针(作为一个长成员),并将删除其中重写的finalize()方法中的本机对象.有关详情,请参阅此问题.
C++对象不消耗其他类型的资源,只消耗内存.对象的内存占用量不是很高,但它基本上高于Java中64位的长度.有没有办法告诉Java的GC,我的包装器不仅仅是一个很长的值,而且在运行垃圾收集之前创建数百万个这样的对象并不是一个好主意?在.NET中有一个GC的AddMemoryPressure()方法,正是出于这个目的.Java中是否存在等价物?
java java-native-interface garbage-collection memory-management
(我对WPF还是很陌生,所以这个问题可能看起来很明显或不一致。)
要求从子模式窗口中编辑一些应用程序的基础业务数据,并且仅当用户在此窗口中按“确定”按钮时才更新数据。我们将此窗口称为“设置对话框”。
在这种情况下,使用WPF数据绑定将SettingsDialog的控件绑定到业务数据是否仍然合理?(如果是这样,那么仅在用户按下SettingsDialog的“确定”按钮时如何更新业务数据?)
还是最好在显示SettingsDialog时从业务数据中手动分配SettingsDialog控件的值,然后仅在用户按下OK按钮时才将其分配回来?
正确选择的参数是什么(较小或更清晰的代码,性能,可扩展性)?
类似情况是否存在一些公认的设计模式?
编辑:我将Bubblewrap的答案标记为已接受,因为它最适合我自己的具体情况。虽然,Guard和John的回答似乎也可以接受。
总结一下:使用数据绑定具有一些优点。它允许SettingsDialog对业务对象内部连接和依赖性(如果有)一无所知,允许稍后轻松地从模式模式切换到非模式模式,减少GUI和业务数据之间的依赖性。
为了在单击OK按钮时实现对象更改,可以使用对象克隆/分配,或者对象可以实现IEditableObject接口。
但是,在某些琐碎的情况下,使用数据绑定可能会产生一些不必要的开销。
我在ActiveSync上使用TCP/IP从Windows CE设备连接到Windows XP桌面.无论桌面服务器应用程序是否实际运行,WinSock connect()函数总是成功.
以下简化代码演示了此问题:
#include "stdafx.h"
#include <Winsock2.h>
int _tmain(int argc, _TCHAR* argv[])
{
const int Port = 5555;
const char * HostName = "ppp_peer";
WSADATA wsadata;
if (WSAStartup(MAKEWORD(1, 1), &wsadata) != 0)
return 1;
struct hostent * hp = gethostbyname(HostName);
if (hp == NULL)
return 1;
struct sockaddr_in sockaddr;
memset(&sockaddr, 0, sizeof(sockaddr));
sockaddr.sin_family = AF_INET;
sockaddr.sin_addr.s_addr = ((struct in_addr *)(hp->h_addr))->s_addr;
sockaddr.sin_port = htons(Port);
int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == SOCKET_ERROR)
return 1;
int result = …
Run Code Online (Sandbox Code Playgroud) 凭借C++和C#经验以及一些小知识,我现在正在开始一个Java + JNI(C++)项目(Android,如果这很重要).
我有一个本机方法,它创建一些C++类并返回一个指向它的指针作为Java long值(比如句柄).然后在其中使用Java代码调用其他本机方法,使用句柄作为参数在此类上执行一些本机操作.C++方面不拥有该对象,它是Java方面的人.但是在当前的架构设计中,很难定义谁拥有对象以及何时删除它.因此,使Java VM垃圾收集器以某种方式管理对象的生命周期可能会很好.C++类不消耗任何资源,除了一些内存,不是很大.如果几个这样的物体不会被破坏,那就没关系了.
在C#中,我可能会在一些托管包装类中包装本机IntPtr句柄.并且当托管包装器被垃圾收集时,覆盖它的终结器来调用本机对象的析构函数.SafeHandle,AddMemoryPressure等也可能对此有所帮助.
这是与Java最终确定的不同的故事.你在Java中的'Hello world'之后知道的第二件事是使用finalize是不好的.有没有其他方法可以在Java中实现这一目标?也许使用PhantomReference?
java java-native-interface garbage-collection memory-management native
我的解决方案有一个非托管C++ DLL,它导出一个函数,一个托管应用程序PInvokes这个函数.
我刚刚将解决方案从.NET 3.5转换为.NET 4.0并得到了这个PInvokeStackImbalance "对PInvoke函数的调用[...]已经使堆栈失衡"异常.事实证明,我正在调用__cdecl'ed函数,因为它是__stdcall:
C++部分(被调用者):
__declspec(dllexport) double TestFunction(int param1, int param2); // by default is __cdecl
Run Code Online (Sandbox Code Playgroud)
C#部分(来电者):
[DllImport("TestLib.dll")] // by default is CallingConvention.StdCall
private static extern double TestFunction(int param1, int param2);
Run Code Online (Sandbox Code Playgroud)
所以,我已经修复了这个bug,但现在我对.NET 3.5中的工作原理感兴趣吗?当没有人(既不是被叫者也不是调用者)清理堆栈时,为什么(多次重复)情况没有引起堆栈溢出或其他一些不当行为,但只是工作正常?Pnvoke中是否有某种检查,就像Raymond Chen在他的文章中提到的那样?这也很有趣,为什么相反类型的破坏约定(让__stdcall被调用者像被__cdecl一样被PInvoked)根本不起作用,导致只有EntryPointNotFoundException.
我使用AssertConfigurationIsValid方法对我的映射配置文件进行单元测试.为了使它接受我的映射,我需要显式地忽略未映射的目标属性.这会污染我的映射代码并降低其可读性.由于仅在AssertConfigurationIsValid传递的单元测试中需要这样做,所以我想将"忽略"代码移动到相同的单元测试中.
考虑来自某个映射配置文件类的以下映射代码:
CreateMap<SourceType, DestinationType>()
// here goes some actual mapping code:
.ForMember(dest => dest.DestMember, opt => opt.MapFrom(src => src.SourceMember))
// and then go the explicitly ignored unmapped dest members,
// just for AssertConfigurationIsValid to pass:
.ForMember(dest => dest.IgnoredMember, opt => opt.Ignore());
Run Code Online (Sandbox Code Playgroud)
我想将后一个代码移动到单元测试方法,因此它将如下所示:
[TestMethod]
public void TestMappingConfiguration()
{
Mapper.AddProfile<MyProfile>();
Mapper.FindTypeMapFor<SourceType, DestinationType>()
.ForMember(dest => dest.IgnoredMember, opt => opt.Ignore());
Mapper.AssertConfigurationIsValid(MyProfile.Name);
}
Run Code Online (Sandbox Code Playgroud)
Mapper类中已经存在FindTypeMapFor方法,但我找不到向映射添加忽略属性的好方法.这可能吗?
c++ ×3
java ×2
.net ×1
64-bit ×1
activesync ×1
automapper ×1
c ×1
c# ×1
cdecl ×1
data-binding ×1
drivers ×1
embedded ×1
exception ×1
modal-dialog ×1
native ×1
nsis ×1
pinvoke ×1
qt ×1
sockets ×1
stdcall ×1
unit-testing ×1
windows-ce ×1
wow64 ×1
wpf ×1