ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

QNo.4001144 IMalloc_Free: 識別子が見つかりません<-どこにあるのでしょう
質問者:mitarashi 日経ソフトウェア誌の記事をまとめた、「APIで学ぶWindows徹底理解」
http://software.nikkeibp.co.jp/software/backno/04apimook1.html
というムック本のコードをなぞってみようとしているのですが、タイマーを用いた間欠ファイルコピーのソースを、VC++2005standard版のプロジェクトに載せ替えてビルドすると、
「error C3861: 'IMalloc_Free': 識別子が見つかりませんでした」
というエラーが1個残り、ビルドできません。
ソースは上記URLからダウンロードできる、apip3.lzhのtimer\FileCopy.Cにありますが、下記ヘッダーファイルを指定しております。
#define COBJMACROS
#include <windows.h>
#include "stdafx.h"
#include<Commdlg.h>
#include <shlobj.h>
#include <stdlib.h>
#include <stdio.h>
#include <objidl.h>
IMalloc_Freeはどこで規定しているのでしょうか。WEB上では、日本語の情報はほとんど見つかりませんでした。また、C:ドライブ全体に全文検索をかけても、ヘッダーファイル等の中ではヒットしませんでした。
英文のサイトで見つけた下記定義を試しに加えてみると、エラーが出なくなりましたが、意味も分かっていないので心配です。
#define IMalloc_Free(self, list) ((self)->Free(list))
#define IMalloc_Release(self) ((self)->Release())
正解をご存じの方、よろしくお願いいたします。
困り度:
  • 困っています
質問投稿日時:
08/05/06 11:10
この質問に対する回答は締め切られました。

回答

ANo.5 ひとつ書き忘れました
ソースそのままの場合
文字セットの設定をUnicodeモードから MBCS(マルチバイト)モードに変更しました
回答者:redfox63
種類:アドバイス
どんな人:専門家
自信:参考意見
回答日時:
08/05/06 17:54
この回答へのお礼試行までしていただき、ありがとうございました。
プロジェクトが沢山できるのが嫌で、複数のソースを#ifdefで囲ってプロジェクトファイルの使い回しをしておりました。ご指摘の通り、新規にプロジェクトを作成してビルドすると、ビルドできました。試しにソースの拡張子を変更してFileCopy.cppにすると、先のエラーが発生しました。この場合は、No.3のご回答にあった、
>『C コードとしてコンパイル (/TC)』に変更して リビルド
すると、エラーが出なくなりました。
お手数をおかけして申し訳ありません。おかげ様で、ヘッダーファイルの中味について、少し勉強になりました。
もうしばらく置いてから、閉めさせていただきます。

回答良回答20pt

ANo.4 そのままで ワーニングは出る物のエラーにはなりませんね …

プロジェクトの作成の仕方を間違えていないですか?

当方は 新規作成 > Win32 > Win32プロジェクト
プロジェクト名などを決定して『アプリケーションの設定』で
『Windowsアプリケーション』『空のプロジェクト』
で作成

出来上がった ソリューションフォルダーに 解凍したソースをコピー
IDEで プロジェクト > 既存の項目の追加で
『FileCopy.c』『FileCopy.h』『FileCopy.rc』を選択
といった手順で構築しました

ワーニングは strcatやstricmpに関する物でした
回答者:redfox63
種類:回答
どんな人:専門家
自信:参考意見
回答日時:
08/05/06 17:50
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

ANo.3 もしかすると、 全て CPP(C++)としてコンパイルしているのではないでしょうか

プロジェクト > プロパティ > C/C++ > 詳細 を選択
『コンパイル言語の選択』の部分を確認してみましょう
ここが 『C++ コードとしてコンパイル(/TP)』になっているなら
『C コードしてコンパイル (/TC)』に変更して リビルドしてみてください
回答者:redfox63
種類:アドバイス
どんな人:専門家
自信:自信あり
回答日時:
08/05/06 14:15
この回答へのお礼追加情報ありがとうございました。
ご指摘の通り、元々拡張子がcのソースなのに、c++として扱っている事に原因があるのかと、当方でも__cplusplusと、CINTERFACEについて調べてみましたが、特に後者は意味が分かりませんでした。
さて、アドバイスいただいたオプションの変更を行ってみましたが、問題のエラーは消えず(エラー番号は変わりましたが)、別のエラーが増えてしまいました。
hoge.obj : error LNK2019: 未解決の外部シンボル _IMalloc_Free が関数 _FileCopy で参照されました。
C:\Documents and Settings\????\hoge.exe : fatal error LNK1120: 外部参照 1 が未解決です。
ご検討のほど、よろしくお願いいたします。

回答

ANo.2 PlatFormSDKをバージョンアップされてみてはいかがでしょう

VS2005のヘルプで
Win32 と COMの開発
  PlatformSDK
    Intoroduction
のページの下部の方にある『See Also』の『Platform SDK Download site』のリンクからSDKのアップデートがダウンロード出来ますよ
回答者:redfox63
種類:アドバイス
どんな人:専門家
自信:参考意見
回答日時:
08/05/06 11:59
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

ANo.1 PlatformSDKの objidl.hの1128行目で定義されていますよ
回答者:redfox63
種類:アドバイス
どんな人:専門家
自信:参考意見
回答日時:
08/05/06 11:54
この回答へのお礼回答ありがとうございます。objidl.hにある事を確認いたしました。(当方では1140行目でした)
#define COBJMACROS、#include <objidl.h>
共に記述してあって、エラーが出るという事は、objidl.hの、#else /* C style interface */ の方に該当しなからという事でしょうか。#if defined(__cplusplus) && !defined(CINTERFACE)の意味もさっぱり分かりませんので、対応方法も含め、教えていただけると幸いです。
<objidl.h>抜粋
#if defined(__cplusplus) && !defined(CINTERFACE)

#else /* C style interface */

#ifdef COBJMACROS
#define IMalloc_Free(This,pv) \
(This)->lpVtbl -> Free(This,pv)

#endif /* COBJMACROS */
#endif /* C style interface */
よろしくお願いいたします。
なお、全文検索の方は、今回ダウンロードしたところで、使い方を理解できていないのか、セキュリティの関係でうまく検索できていないのかもしれません。