フリーソフト

C++Builder

[C++Builder] Duplicate resource: Type 24 (user-defined), ID 1の対処法

C++ Builder 2009 で以下のような警告が出たときの対処法です。

Duplicate resource:  Type 24 (user-defined), ID 1 ...

対処法:「プロジェクト」の「オプション」メニューを開いて、「アプリケーション」のページにある「ランタイムテーマを有効にする」のチェックを外せばOKです。







[C++Builder] オートコンプリート IAutoComplete2の使い方

ソースをそのままのせます。

ヘッダーファイル

//--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <System.Classes.hpp> #include <Vcl.Controls.hpp> #include <Vcl.StdCtrls.hpp> #include <Vcl.Forms.hpp> #include <ShlObj.h> #include <ComObj.hpp> #include <ShlGuid.h> //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE で管理されるコンポーネント   TMemo *Memo1;   TEdit *Edit1;   void __fastcall FormCreate(TObject *Sender); private: // ユーザー宣言   IAutoComplete2 *FAutoComplete;   IUnknown *FStrings; public: // ユーザー宣言   __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- class TEnumString: public IEnumString { private:   TStringList *FStrings;   ULONG FIndex;   ULONG FRefCount; public:   //IUnknown implementation   STDMETHODIMP_(ULONG) AddRef();   STDMETHODIMP_(ULONG) Release();   STDMETHODIMP QueryInterface(REFIID riid, void** ppvObject); protected:   HRESULT STDMETHODCALLTYPE Next(ULONG celt,LPOLESTR *rgelt,ULONG *pceltFetched);   HRESULT STDMETHODCALLTYPE Skip(ULONG celt);   HRESULT STDMETHODCALLTYPE Reset(void);   HRESULT STDMETHODCALLTYPE Clone(IEnumString **ppenum); public:   __fastcall TEnumString(void);   __fastcall TEnumString(TStrings *Strings);   __fastcall ~TEnumString(void);   void __fastcall Clear(void);   void __fastcall Add(UnicodeString S);   void __fastcall Assign(TStrings *Source); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif

ソースファイル
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; /* TEnumString */ //--------------------------------------------------------------------------- __fastcall TEnumString::TEnumString(void)   :IEnumString() {   FStrings=new TStringList;   FStrings->Sorted=true;   FStrings->Duplicates=dupIgnore; } //--------------------------------------------------------------------------- __fastcall TEnumString::TEnumString(TStrings *Strings)   :IEnumString() {   FStrings=new TStringList;   FStrings->Sorted=true;   FStrings->Duplicates=dupIgnore;   this->Assign(Strings); } //--------------------------------------------------------------------------- __fastcall TEnumString::~TEnumString(void) {   delete FStrings; } //--------------------------------------------------------------------------- STDMETHODIMP_(ULONG) TEnumString::AddRef() {   return ::InterlockedIncrement(reinterpret_cast<LONG*>(&FRefCount)); } //--------------------------------------------------------------------------- STDMETHODIMP_(ULONG) TEnumString::Release() {   ULONG nCount=(ULONG)::InterlockedDecrement(reinterpret_cast<LONG*>(&FRefCount)); if (nCount==0) delete this;   return nCount; } //--------------------------------------------------------------------------- STDMETHODIMP TEnumString::QueryInterface(REFIID riid, void** ppvObject) {   HRESULT hr=E_NOINTERFACE;   if (ppvObject!=NULL) {     *ppvObject=NULL;     if (IID_IUnknown==riid)       *ppvObject=static_cast<IUnknown*>(this);     if (IID_IEnumString==riid)       *ppvObject=static_cast<IEnumString*>(this);     if (*ppvObject!=NULL) {       hr = S_OK;       ((LPUNKNOWN)*ppvObject)->AddRef();     }   } else {     hr=E_POINTER;   }   return hr; } //--------------------------------------------------------------------------- HRESULT STDMETHODCALLTYPE TEnumString::Next(ULONG celt,LPOLESTR *rgelt,ULONG *pceltFetched) {   HRESULT hr=S_FALSE;   if (!celt) celt=1;   ULONG i=0;   for (i = 0;i<celt;i++) {     if (FIndex>(ULONG)FStrings->Count-1) break;     UnicodeString Str=FStrings->Strings[FIndex];     rgelt[i] = (LPWSTR)::CoTaskMemAlloc((ULONG) sizeof(WCHAR)*(Str.Length()+1));     lstrcpy(rgelt[i], Str.w_str());     if (pceltFetched) *pceltFetched++;     FIndex++;   }   if (i == celt) hr=S_OK;   return hr; } //--------------------------------------------------------------------------- HRESULT STDMETHODCALLTYPE TEnumString::Skip(ULONG celt) {   HRESULT hr=S_FALSE;   if ((FIndex+celt)<=(ULONG)FStrings->Count) {     FIndex+=celt;     hr=S_OK;   } else {     FIndex=FStrings->Count;     hr=S_FALSE;   }   return hr; } //--------------------------------------------------------------------------- HRESULT STDMETHODCALLTYPE TEnumString::Reset(void) {   FIndex=0;   return S_OK; } //--------------------------------------------------------------------------- HRESULT STDMETHODCALLTYPE TEnumString::Clone(IEnumString **ppenum) {   HRESULT Result=S_OK;   try {     *ppenum=new TEnumString(FStrings);     Result=S_OK;   } catch(...) {     Result=E_UNEXPECTED;   }   return Result; } //--------------------------------------------------------------------------- void __fastcall TEnumString::Clear(void) {   FStrings->Clear(); } //--------------------------------------------------------------------------- void __fastcall TEnumString::Add(UnicodeString S) {   FStrings->Add(S); } //--------------------------------------------------------------------------- void __fastcall TEnumString::Assign(TStrings *Source) {   FStrings->Assign(Source); } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner)   : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) {   CoInitialize(NULL);   OleCheck(CoCreateInstance(CLSID_AutoComplete,NULL,CLSCTX_INPROC_SERVER,IID_IAutoComplete2,(void **)(&FAutoComplete)));   FStrings=new TEnumString(Memo1->Lines);   OleCheck(FAutoComplete->SetOptions(ACO_AUTOSUGGEST|ACO_UPDOWNKEYDROPSLIST));   OleCheck(FAutoComplete->Init(Edit1->Handle,FStrings,NULL,NULL)); } //---------------------------------------------------------------------------

[C++Builder,Delphi] デバッグウインドウにメッセージを表示する

OutputDebugString 関数を使うとIDEのデバッグ画面にメッセージを表示することができます。スレッドのデバッグなどに有効です。

Cryptographic API(CryptoAPI、CAPI)を使ってMD5などのハッシュ値を求める

Cryptographic API(CryptoAPI、CAPI)
 http://msdn.microsoft.com/en-us/library/aa380256.aspx

//---------------------------------------------------------------------------
UnicodeString __fastcall CalcHash(UnicodeString Str)
{
  UnicodeString Result="";
  HCRYPTPROV hCryptProv = NULL;
  HCRYPTHASH hHash = NULL;

  if (!::CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, 0)) {
    if(!::CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET)) {
      return Result;
    }
  }

  try {
    if (!::CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, &hHash)) return Result;
    try {
      AnsiString TmpStr=Str;
      if (!::CryptHashData(hHash, (BYTE*)TmpStr.c_str(), (DWORD)TmpStr.Length(), 0)) return Result;
      BYTE bData[1024];
      memset(bData, 0, sizeof(bData));
      CHAR Digits[] = "0123456789abcdef";
      DWORD dwDataLen = 16;
      if (!::CryptGetHashParam(hHash, HP_HASHVAL, bData, &dwDataLen, 0)) return Result;
      Result="";
      for (DWORD i = 0; i < dwDataLen; ++i) {
        Result+=Digits[bData[i] >> 4];
        Result+=Digits[bData[i] & 0xf];
      }
    } __finally {
      if (hHash) ::CryptDestroyHash(hHash);
    }
  } __finally {
    if (hCryptProv) ::CryptReleaseContext(hCryptProv,0);
  }
  return Result;
}

[C++Builder] ActiveXでエラーダイアログが表示されるのを抑制する

ActiveXコントロールをインストールして利用する際に、何らかのエラーが発生するとHRCHECK: というタイトルのエラーダイアログが表示されます。例外ではないため、try catch で囲ってもダイアログの表示を抑制することができません。

ソースを見ると、このダイアログは PROMPT_ON_HRCHECK_FAILURE が define されていると表示されるようです。そのため、プロジェクトのオプションで NO_PROMPT_ON_HRCHECK_FAILURE を定義しておけば、このダイアログを表示しないようすることができます。

さらに詳しく知りたい人のためのキーワード:utilcls.h、OLECHECK、DebugHlpr_THROW

[C++Builder] ファイル名がワイルドカードにマッチしているかを調べる

#include <Masks.hpp>

MatchesMask

[C++Builder] SIMD

#include <nmmintrin.h>   // MMX-SSE4.2
#include <smmintrin.h>   // MMX-SSE4.1
#include <intrin.h>      // MMX-SSE3
#include <emmintrin.h>   // MMX-SSE2
#include <xmmintrin.h>   // MMX-SSE
#include <mmintrin.h>    // MMX

 

[C++Builder] PNGを読み込むと未解決の外部参照 'Pnglang'

C++ Builder 2009でTImageにPNG画像を読み込んでコンパイルすると以下のエラーがでる。TPNGImageを直接利用しても同様のエラー。

[ILINK32 エラー] Error: 未解決の外部参照 'Pnglang::_EPngInvalidCRCText' が C:\PROGRAM FILES\CODEGEAR\RAD STUDIO\6.0\LIB\OBJ\PNGIMAGE.OBJ から参 照されました

画像処理のパッケージがVCLJPGからVCLIMGに変更されたことが原因。
プロジェクトにPnglang.hppを追加するか(Program Files以下で検索すれば見つかる)、PNGImage.hppの適当なところに

#pragma link "vclimg.lib"

を書いておけば大丈夫

[C++Builder] AnsiStringでコードページを指定する

C++Builder 2009ではAnsiStringでコードページが指定できます。

typedef AnsiStringT<932> SJISString;

[C++Builder] 警告を表示しないようにする

//非表示にする
#pragma warn -8056

//表示するようにする
#pragma warn .8056

VCの
#pragma warning(disable : 8056)
#pragma warning(default : 8056)
に対応

より以前の記事一覧