Наконец-то я получил некоторое время, чтобы обновить класс видеозахвата. Я хотел сравнить VFW (что я использовал до сих пор) и DirectShow. Как и ожидалось, DirectShow быстрее, но когда я добавил информационные тексты, вдруг AnsiString::sprint()
больше не является членом AnsiString
.Включая DShow.h breaks 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++;
}
//---------------------------------------------------------------------------
Это только простой VCL Form приложение с одним TTimer
на нем. TTimer
увеличивает счетчик i
и выводит его в Caption
формы. DirectX libs даже не связаны, только заголовки включены!
Линкер выдает ошибку:
[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. Что/где именно это вызывает?
Единственное решение, которое я могу думать, и должен работать (но я хочу, чтобы избежать этого, если я могу), чтобы создать OBJ (или DLL) с DirectShow вещи, и затем свяжите это со стандартным проектом VCL без включения в него dshow.h
, и, конечно же, экспорт должен быть без каких-либо забавных вещей.
попробуйте "#undef sprintf" после включения dshow.h – JeffRSon
@JeffRSon да, это работает, чтобы ответить, поэтому я могу принять его странно, поскольку VCL включен до DShow ... но он работает – Spektre