我终于有时间升级我的视频捕捉课程。我想比较VFW(我到目前为止使用的)和DirectShow。正如预期的那样,DirectShow更快,但是当我添加信息文本时,突然AnsiString::sprint()
不再是AnsiString
.
经过一番努力,我找到了一个AnsiString::printf()
仍然有效的解决方法,但我很好奇如何解决这个问题。也许有些定义dshow.h
和dstring.h
冲突?
我削减了所有不必要的代码来显示这个问题:
//$$---- Form CPP ----
//---------------------------------------------------------------------------
#include <vcl.h>
#include <dshow.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
static int i=0;
Caption=AnsiString().sprintf("%i",i); // this does not work
AnsiString s; s.printf("%i",i); Caption=s; // this does work
i++;
}
//---------------------------------------------------------------------------
它只是一个简单的 VCL 表单应用程序,TTimer
上面有一个。这TTimer
是递增计数器i
并将其输出到表单的Caption
. DirectX库甚至没有链接,只是包含头文件!
链接器输出错误:
[C++ Error] Unit1.cpp(20): E2316 'sprintf_instead_use_StringCbPrintfA_or_StringCchPrintfA' is not a member of 'AnsiString'
如果我在这一行交换vcl.h
和 dshow.h dstring.h`:includes, the compiler stops in
AnsiString& __cdecl sprintf(const char* format, ...); // Returns *this
使用此错误消息:
[C++ Error] dstring.h(59): E2040 Declaration terminated incorrectly
因此,显然存在一些冲突(AnsiString
关键字是问题)。放入dshow.h
anamespace
也无济于事。
有没有人有任何线索?
Q1。如何解决这个问题?
Q2。究竟是什么/哪里导致了这种情况?
我能想到并且应该工作的唯一解决方案(但如果可以的话,我想避免它)是用DirectShow的东西创建一个OBJ(或DLL),然后将它链接到一个标准的VCL项目中,而不包括在它,当然出口也必须没有任何有趣的东西。dshow.h