フリーソフト

C++Builder

[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)
に対応

[BCB] 「すべてはい」「すべていいえ」がついたMessageBox

   TForm *Dlg=CreateMessageDialog("元のファイルが上書きされます。続行し
てもよろしいですか?",mtWarning,TMsgDlgButtons() <<mbOk<<mbNoToAll<<mbYesToAll<<mbCancel);
  Dlg->Caption="警告";
  Dlg->ShowModal();
  delete Dlg;

TMsgDlgBtn値、戻り値
mbOK、mrOk
mbCancel、mrCancel
mbYes、mrYes
mbNo、mrNo
mbAbort、mrAbort
mbRetry、mrRetry
mbIgnore、mrIgnore
mbAll、mrAll
mbNoToAll、mrNoToAll
mbYesToAll、mrYesToAll

[BCB] dfmファイルを使わずにFormを作成する

TFormのCreateNewメソッドを使います。普通にnewするとリソースが見つからない、とエラーになります。

より以前の記事一覧