質問 |
||
| 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 */ よろしくお願いいたします。 なお、全文検索の方は、今回ダウンロードしたところで、使い方を理解できていないのか、セキュリティの関係でうまく検索できていないのかもしれません。 |