最終的にビデオキャプチャクラスをアップグレードする時間がありました。私はVFW(今まで私が使っていたもの)とDirectShowを比較したかったのです。予想通り、DirectShowは高速ですが、情報テキストを追加すると、AnsiString::sprint()
はもはやAnsiString
のメンバーになりません。DShow.hを含むことでVCL AnsiString :: sprintf()がBDS2006に壊れています
いくつかの苦労の末、私は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++;
}
//---------------------------------------------------------------------------
それはそれで一つのTTimer
との単純なVCLフォームアプリです。 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 includes, the compiler stops in
dstring.h`を入れ替える場合:
AnsiString& __cdecl sprintf(const char* format, ...); // Returns *this
このエラーメッセージで:
[C++ Error] dstring.h(59): E2040 Declaration terminated incorrectly
したがって、明らかにいくつかの競合があります(AnsiString
キーワードはtです彼の問題)。 dshow.h
をnamespace
に入れることも役に立ちません。
誰にも手がかりがありますか?
Q1。これを修正するには?
Q2。 What/whereは正確にこれを引き起こしていますか?
私は考えることができ、かつ動作するはず唯一の解決策(私は私ができるならば、それを避けたい)、OBJ(またはDLL)を作成することですDirectShowのものとし、それを標準VCLプロジェクトにリンクしてください。それにはdshow.h
が含まれていません。もちろん、面白いこともありません。
dshowを組み込んだ後に "#undef sprintf"を試してください。h – JeffRSon
@JeffRSonはいそれは答えを作るので、私はVCLがDShowの前に含まれているのでそれが奇妙であると受け入れることができます...しかし、それは動作します – Spektre