VS2008(VC9)

VS2008 prsht.h error RC2248: Symbol name too long

VS2008のリソースを編集しようとしたところ、発生したエラー。
**.rcファイルを直接編集し、「#include "prsht.h"」を追加ことで対処。

#define APSTUDIO_HIDDEN_SYMBOLS
#include "windows.h" 
#include "prsht.h"
#undef APSTUDIO_HIDDEN_SYMBOLS

参考リンク


AfxActivateActCtxでエラー@VS2008

VS6で作成したプロジェクトをやんごとなき理由によりVS2008へ変換したら、

 

sfxstate.cpp下記の部分で落ちた。

 

 

BOOL AFXAPI AfxActivateActCtx(HANDLE hActCtx, ULONG_PTR *lpCookie)

 

{ 

 

 BOOL rc = pfnActivateActCtx != 0 ? pfnActivateActCtx(hActCtx, lpCookie) : FALSE

 

 return rc;

 

}

 

前にも対策したことがあるけど、その都度Google先生に問い合わせるのも気がひけるので

 

対策コードを以下にメモ。
BOOL CHogeApp::InitInstance() 

 

{

 

  CWinApp::InitInstance();

 

  afxAmbientActCtx = FALSE;  //<--このフラグを追加

 

  :

 

}

 

<参考>

 

続きを読む "AfxActivateActCtxでエラー@VS2008" »

Visual Studio 2008用透過bitmap(32bit)の作成

突然、Visual Studio 2008用のRibonコントロール(CMFCRibbonCategoryとか)で使う32bit Bitmapファイルが作りたくなったので作業メモ。
  1. アルファチャンネル付きPNGファイルでツールバー元データを作成
  2. PNGto32bit BMPで32bit bitmapファイルを作成
    • https://pngtobmp32.codeplex.com/
    • <使い方>
    • PNGtoBMP32.exeを実行
    • 表示されたウィンドウにPNGファイルをDrag&Drop
    • 変換された32bitBitmapファイルは元ファイル名の拡張子違い(hoge.png→hoge.bmp)
  3. Visual Studio 2008のbitmapリソースとして登録
VisualStudio2015とかでも32bit Bitmapが直接編集できないっぽい噂は未検証。

Visual Studio 2008でもOpenCV3.0.0

VS2015(VC14)でOpenCV3.0.0のライブラリができたので同じ要領でVisualStudio2008(VC9)用のOpenCV3.0.0ライブラリをビルドしたのでそのメモ。

1.OpenCV3.0.0を準備 (2015/06/04版を使用)
2.CMakeでVisualStudio2008用プロジェクト作成
3.「stdint.h」「vcruntimeh」をVisualStudio2015から移植
  • 「C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include」から「C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include」へコピーとか。
  • 上記2ファイルはVisualStudio2010以降から存在してるらしい。
4.cap_mjpeg_decorer.cppの下記コードを変更
std::vector<char> MotionJpegCapture::readFrame(frame_iterator it)

{

     m_file_stream.seekg(it->first);

     RiffChunk chunk;

     m_file_stream >> chunk;

     std::vector<char> result;

     result.reserve(chunk.m_size);

     result.resize(chunk.m_size);

//  m_file_stream.read(result.data(), chunk.m_size);  //オリジナルコード.C++11

     m_file_stream.read(&(result[0]), chunk.m_size);  //VC9にはdata()なんてない

     return result;

}

5.VisualStdio2008から「ALL_BUILD」を選択/ビルドすることで、サンプルexeとlibが作成されます。
<参考>

PIC24FでSetCommStatusするとエラー

最近PICをいじっていてハマったことをメモします。
<前提となる環境>

  • PIC24F64GB002 +Microchip Solutions v2012-07-18でのMSD+CDCファームを作成
  • 後閑先生の「改定新板 PICで楽しむUSB機器 自作のすすめ」が参考書
  • usb_config.hでUSB_INTERRUPTにより割り込み処理設定済み
  • コンパイラはMPLAB8.84+C30(V3.25)

<現象>

  • TeraTermではなんの問題もなくCDC通信できてたので余裕かましていたら、自前アプリでの通信時にエラーで涙目
  • デバッガーで追いかけるとGetCommStatusは成功するがSetCommStatusでエラーが100%発生して終了している
  • GetLastError()値は 31(0x1F) システムに接続されたデバイスが機能していません。
  • 英語版なら「A device attached to the system is not functioning.」

<原因>

  • usb_function_cdc.cで定義されているUSBCheckCDCRequest();をどこからも呼び出していないのが問題。(SetCommStatusの応答処理を行う)
  • 「改定新板 PICで楽しむUSB機器 自作のすすめ」のMSDサンプル(GPSロガー)のコード(P.326)を鵜呑みにしたのが敗因。
  • TeraTermはSetCommStatusの戻り値(成功or失敗)にかかわらず処理をすすめるナイスな奴っぽい。だけどオーソドックスなAPI利用のシリアル通信だと今回のようにエラーで身動きがとれなくなる。
  • 先生のCDC動作確認もTeraTermなので多分気づかない
  • SetCommStatusは少なくない量のデータを送るので、低クロックなPICの場合問題になることがある。PIC24Fは32MHz駆動で特に問題はでてない。

<解決策>

後閑先生のコードを参考にしたのなら、main.cとかに存在するはずのUSBCBCheckOtherReqへUSBCheckCDCRequest();を追加することでスルっと幸せになれます。

void USBCBCheckOtherReq(void)
{
    USBCheckMSDRequest();
}

          ↓

void USBCBCheckOtherReq(void)
{
    USBCheckMSDRequest();
    USBCheckCDCRequest(); //これを追加。
}

ということで、PICに関係してない人には何が何やらな内容ですが、いつものように関連キーワードてんこ盛りなので、きっと誰かの役に立つはずと信じて終わります。

あと、「技術評論社か先生のページにでも修正(なんだろうか・・)依頼をだせyo」って声も感じなくはないのですが、畏れ多いのでここにこそっとメモします。つか、この問題で8時間もロスしたよ。USB動作の勉強にはなったけど・・・(T∇T)

<参考リンク>

CFileDialogと0x000006BA:RPCサーバを利用できませんエラー

VC6時代のプロジェクトをVC9(VisualStudio2008 SP1)に移植&64bit化するハメになり、まぁ幾多のトラブルを乗り越えたのですが、一番ムカついた症状をメモしておきます。

一通りビルドを通し実行テストを行うと問題なし。
で、「ファイルを開く」を選択すると、「0x000006BA:RPCサーバを利用できません」で強制デバッグモードへ。(当然「名前をつけて保存」も同じ)

たとえば、こんなシンプルなコード

CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"All Files|*.*||",this);
dlg.DoModal(); //→「RPCみつからないエラー」

とか

CFileDialog  dlg(TRUE);
dlg.DoModal(); //→「RPCみつからないエラー」

で、ほとんどすべてをデフォルトにしてもエラー。

結論的には、VisualStudio2008で拡張されたCFileDialogの引数(BOOL bVistaStyle)がデフォルトでTRUEなのが原因でした。(CFileDialog::DoModal()をステップ実行して見つけた)
対策としては

CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"All Files|*.*||",this,0,FALSE);

として無事動作確認完了。

あとはCFileDialogを検索して「0,FALSE」をコピーして終了。
新しい機能は標準でONにしたい&XP以前を皆殺しにしたいのは理解できるのですが、もう少しマシなエラーを表示してもらえると助かります。

つか、MSDN(VisualStudio2008)の該当欄を見ると

bVistaStyle パラメータは、Windows Vista でのみ適用できます。以前のバージョンの Windows では、このパラメータは無視されます。bVistaStyleTRUE に設定し、Windows Vista でプログラムをコンパイルすると、新しい Vista スタイルのファイル ダイアログが使用されます。それ以外の場合は、以前の MFC スタイルのファイル ダイアログが使用されます。このように、現在のプロジェクトを Windows Vista 環境で再コンパイルすると、新しい Vista ダイアログ ボックスを利用できるようになります。詳細については、「CFileDialog クラス」を参照してください。

ってことで、Windows7でコンパイルした場合にbVistaStyleが無視されないのは良いのですが、現象として「RPCエラー」になるのはなかなか想像できないと思います。VisualStudio2010以降だと修正されてるのか気になります。

大人の事情で全く画がないのですが、そこは察してください。

zlib1.2.5

久しぶりにzlibを使う事になり、zlib1.2.5をVC2008でビルドしてみたところ・・・

infback.obj : error LNK2019: 未解決の外部シンボル _inflate_fast 関数 _inflateBack で参照されました。

inflate.obj : error LNK2001: 外部シンボル "_inflate_fast" は未解決です。

zlib1. dll: fatal error LNK1120: 外部参照 1 が未解決です。

でビルドできず。

グーグル先生に聞いてみると、どうやら1.2.4まではOKだったらしいが、1.2.5のmake

ファイルからinffast.objが抜けているのが原因とのこと。

win32\makefile.msc中の

OBJS = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj \

       gzwrite.obj infback.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj

のOBJS行へ inffast.obj を追加してビルド。

OBJS = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj \

       gzwrite.obj infback.obj inflate.obj inffast.obj inftrees.obj trees.obj uncompr.obj zutil.obj

無事、zlib.libがゲットできました。

ちなみに、zlibをビルドするコンソールを管理者モードで起動していないと、

「example.exeのmanifest更新失敗エラー」

が発生するので注意が必要です。VisualStudioToolのコンソールからビルドした場合は問題ないと思います。

カレンダー

  • keisan
無料ブログはココログ
2019年11月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30