我拥有一家软件开发公司.我们为其他以其名称/头衔命名的公司开发软件.我们在会计/ ERP市场上也有一些自有品牌的头衔.我们的会计软件大约占我们业务的60%,并使用C++ Builder编写.
那些知道,实现C++ Builder的人在从Borland,CodeGear到Embarcadero的转手方面走的路很艰难,可能还有几次.C++ Builder在我们的会计软件上多次搞砸了我们.众所周知,QuickReports是错误的,他们的XML构建描述并没有与GUI紧密耦合,导致构建不起作用 - 通常是错误的界面.
在过去的8年中,我们已经稳步取消了对VCL和有缺陷的组件的依赖,但是,一些第三方VCL组件仍然不易更换.我们使用Developer Express的GRID包 - 很棒的产品.
我只是处于十字路口并且市场上有最新版本的C++ Builder XE,当你看到这款产品的糟糕历史时,我很难证明价格合理.
因此,我正在寻找可能处于类似情况并成功切换到Visual Studio的其他任何人的建议或步骤.
除了Developer Express工具之外,我们已经将大部分应用程序慢慢移动到wxWidgets.我们编写了自己的TSQL抽象,我们也可以移植.
有什么想法或建议吗?您是否已将项目移至Visual Studio,或者您是否已使用新的Builder XE来发现它之前的许多缺点已经消失?
寻找"去过那里,做过那些"的建议.
我正在学习Windows内核模式驱动程序开发.我编写了一个小型测试驱动程序,我可以在VirtualBox中的VM下运行的Windows 7 32位Ultima版本下成功注册,取消注册,加载和卸载.
我的主机是Windows 7 64位家庭高级版.
编译为64位的驱动程序将不会在Windows 7 Home Edition下加载.我一直拒绝注意到这个版本的Windows不允许未签名的驱动程序.
我尝试了两件事:
我使用F8启动选项允许未签名的驱动程序(不起作用)
我以管理员身份运行CMD并执行以下两个命令
bcdedit.exe -set loadoptions DDISABLE_INTEGRITY_CHECKS
bcdedit.exe -set TESTSIGNING ON
并重新启动.我的桌面在"TestMode"中显示我,但我仍然听到同样的拒绝.
任何人都可以帮助我或解释是否有家庭版的额外步骤?
---- {更新} ----在倾注了大量MSDN之后,看来我的解决方案就是自我签署我创建的驱动程序.我下载的DDK似乎没有工具链来进行自我签名.我已经下载了WinDDK-7600.16385.1.但奇怪的是,如果我只是F8 @启动时间并告诉它允许未签名的驱动程序,我的Windows Ultima Edition会愉快地加载我的驱动程序.
我知道通过引用传递和传递指针的主题被大量覆盖...我很清楚我理解所有的细微差别,直到我读到这个:
http://carlo17.home.xs4all.nl/cpp/const.qualifier.html
读取(如果链接死亡)
The prototype for foobar can have any of the following footprints:
void foobar(TYPE); // Pass by value
void foobar(TYPE&); // Pass by reference
void foobar(TYPE const&); // Pass by const reference
Note that I put the const to the right of TYPE because we don't know if TYPE (this is not a template parameter, but rather for instance a literal char*) is a pointer or not!
Run Code Online (Sandbox Code Playgroud)
作者的意思是"注意我把const放在TYPE的右边,因为我们不知道TYPE ......是否是一个指针!"
我在这个主题上读过的所有内容都一致地说:
void foodbar(TYPE const&)
也是等同的
void foobar(const TYPE&)
如果我理解正确的作者,他/她说的是: …
背景资料:
我目前有一个连接USB端口的硬件设备.硬件设备负责将精确的周期性消息发送到各种网络上,而这些网络又连接起来.在硬件设备内部,我有两个Microchip dsPIC.有两种操作模式.
一种情况是将简单的"作业"发送到dsPIC,然后可以发送精确到0.001厘米的精确消息.这种架构不适用于更复杂的消息传递,我们需要根据PC应用程序中发生的事件发送周期性数据包.所以我们有第二种操作模式,我们的PC应用程序将发送周期性消息,而dsPIC只是简单地转换和发送.顺便说一下,所有这些对我们软件的最终用户来说都是透明的.我们的硬件设备是汽车领域中使用的测试工具.
目前,我们使用FTDI的USB转串口芯片和FTDI Windows驱动程序将硬件连接到我们的PC软件.
问题在于,在我们从PC发送消息的模式二中,我们能够实现的最佳平均硬件范围约为1ms.我们受到Windows内核抢占.我已经尝试了一些"技巧"来改进诸如:
我们所有的软件都是用C/C++编写的.我对高级Windows编程非常熟悉和熟悉; 例如IO Completions,Overlapped I/O,无锁线程队列(实际上是一种设计策略),套接字,线程,信号量等等......
但是,我对Windows驱动程序开发一无所知.我已经阅读了几篇关于KMDF与UDMF和WDM的论文.
我希望经验丰富的Windows内核模式驱动程序开发人员会在这里回复...
下一轮.我们的硬件可以选择更换FTDI芯片并使用dsPIC的USB接口,或者可能将开源Linux FTDI内容移植到Windows,并继续在我们的自定义驱动程序中使用FTDI芯片.我认为通过在PC端访问内核模式驱动程序,我可以建立一个内核驱动程序,可以更精确的间隔发送周期性消息,而无需抢占和/或可能利用DMA.
我们在我们的业务中有一个竞争对手,我认为它与他们的工具完全相似.据我所知,用户空间应用程序无法安排任何优于1ms的线程.我们目前在一个线程中使用timeGetTime.我已经体验过计时器队列(通过CreateTimerQueueTimer)而没有真正的改进.
WDM是实现更精确计时的正确方法吗?
我们的竞争对手是如何实现从Windows驱动信号到硬件的非常精确的时序,并且它们确实加载内核驱动程序(.sys),并且它们的设备运行在USB2.0上,就像我们的一样.
如果WDM是可行的方法,我可以获得一些关于我应该研究什么内核函数来建立时间的建议吗?谢谢阅读
尝试创建一个驱动程序类型类,其中,Base是在实例化时传递类型的驱动程序.在这种情况下,类型2用于构造正确的派生对象.
我的编译器在"Class Base"行上抛出Declaration语法错误.
我的最终目标是能够做到这一点:
Base *B;
B = new Base(2);
if(B)
{
B->DoStuff();
B->DoMoreStuff();
delete B;
}
Run Code Online (Sandbox Code Playgroud)
这是我的代码,不会编译...
class Base
{
public:
Base(int h);
virtual ~Base();
private:
int hType;
Base *hHandle;
};
class Derived1 : public Base
{
public:
Derived1();
virtual ~Derived1();
};
class Derived2 : public Base
{
public:
Derived2();
virtual ~Derived2();
};
Base::Base(int h)
{
hType = h;
switch(h)
{
case 1:
hHandle = new Derived1;
break;
case 2:
hHandle = new Derived2;
break;
}
}
Derived1::Derived1():Base(1)
{ …Run Code Online (Sandbox Code Playgroud) 我继承了一个Delphi应用程序,我对object pascal一无所知.
这是我需要编译到新版本的C++ Builder XE中的BPL.
当我运行make时,我得到错误:
E2064左侧无法分配.
我已经学会了足够多的obj pascal知道我有一个试图被赋值的常量.
但是,显然,你可以克服这种行为; 通过进入Delphi编译器下的Build选项并打开"Assignable Typed constants",实质上将常量转换为vars.
我这样做了,我继续得到同样的错误.
我尝试用{$ J +}和{$ J-}包围我的代码,但仍然无法编译.
procedure TChunkIDAT.CopyInterlacedRGB8(const Pass: Byte;
Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar );
var
Col: Integer;
begin
{Get first column and enter in loop}
Col := ColumnStart[Pass];
Dest := pChar(Longint(Dest) + Col * 3);
repeat
{Copy this row}
Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) + 2)^]; inc(Dest);
Run Code Online (Sandbox Code Playgroud)
在最后一行获取错误.如果我将const更改为var,那么我会得到声明与前一个声明不同但我不知道前一个声明在哪里的错误....
请参阅文章中的以下代码,并不认为它是char*数组的标准C/C++语法.作为测试,Visual C++(visual studio 2005)和C++ Builder Rad XE都拒绝第二行.
不使用#defines,任何人都有任何技巧/提示,以保持enums和字符串数组排序同步而不诉诸STL?
更多的好奇心问题.
enum TCOLOR { RED, GREEN, BLUE };
char *TNCOLOR[] = { [RED]="Red", [GREEN]="Green", [BLUE]="Blue" };
Run Code Online (Sandbox Code Playgroud)
顺便说一句,这篇文章来自于相当陈旧,我相信这可能在海湾合作委员会下有效,但尚未经过测试.
我继承了一些目前使用C++ Builder 2007编译的Delphi组件/代码.我现在只是尝试使用C++ Builder RAD XE编译组件.我不知道Delphi(对象pascal).
以下是似乎存在冲突的"支持"功能的版本.是否有可用于使RAD XE向后兼容的编译器开关?或者我可以对这些函数调用做些什么来纠正模糊性质?
我得到的错误是:
[DCC Error] cxClasses.pas(566): E2251 Ambiguous overloaded call to 'Supports'
SysUtils.pas(19662): Related method: function Supports(const TObject; const TGUID; out): Boolean;
cxClasses.pas(467): Related method: function Supports(TObject; const TGUID; out): Boolean;
{$IFNDEF DELPHI5}
procedure FreeAndNil(var Obj);
var
Temp: TObject;
begin
Temp := TObject(Obj);
Pointer(Obj) := nil;
Temp.Free;
end;
function Supports(const Instance: IUnknown; const Intf: TGUID; out Inst): Boolean; overload;
begin
Result := (Instance <> nil) and (Instance.QueryInterface(Intf, Inst) = 0);
end;
function Supports(Instance: TObject; …Run Code Online (Sandbox Code Playgroud) 这可能吗?如果是这样,我似乎无法正确使用语法.(C++函数指针)
一点背景.此帖子缩短了以下代码.这种实现的原因是为了避免无限的SWITCH/CASE或IF/ELSEIF语句列表; 并有一个无尽的DECODER_FUNCTION_TABLE列表(见下文).此代码涉及使用助记符表示不同内容的行业标准,并且有数百个这些助记符.因此,我的代码的这部分是解码某些助记符从另一段代码传递给它,循环通过传入的记录......无论如何,我的困难在于保持成员函数指针在类外的结构中...
看一看.我认为代码可以更好地解释;)
typedef struct _DECODER_FUNCTION_RECS
{
ISO_MNEMONIC_ID Mnemonic;
void (Database::*pFn)(Database::Rec *);
}DECODER_FUNCTION_RECS;
DECODER_FUNCTION_RECS DECODER_FUNCTION_TABLE[] = {
SFP, &Database::Decode_SFP,
KOG, &Database::Decode_KOG
};
void Database::DecodedDescription(Rec *A)
{
int i = 0;
bool Found = false;
while( i < DECODER_FUNCTION_TABLE_COUNT && !Found )
{
if( DECODER_FUNCTION_TABLE[i].Mnemonic == A->Mnemonic )
Found = true;
else
i++;
}
if( Found )
(([DECODER_FUNCTION_TABLE[i]).*this.*pFn)( A );
}
void Database::Decode_SFP(Rec *A)
{
// do decode stuff on A
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试解决的细节是这一行:
(([DECODER_FUNCTION_TABLE[i]).*this.*pFn)( A );
Run Code Online (Sandbox Code Playgroud)