IMalloc_Free: 識別子が見つかりません<-どこにあるのでしょう

このQ&Aのポイント
  • 「IMalloc_Free: 識別子が見つかりません<-どこにあるのでしょう」というエラーが発生しています。
  • 質問者は、日経ソフトウェア誌の記事をまとめた「APIで学ぶWindows徹底理解」というムック本のコードを参考にしています。
  • タイマーを用いた間欠ファイルコピーのソースをビルドしようとしていますが、IMalloc_Freeという識別子が見つからず、ビルドできません。
回答を見る
  • ベストアンサー

IMalloc_Free: 識別子が見つかりません<-どこにあるのでしょう

日経ソフトウェア誌の記事をまとめた、「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()) 正解をご存じの方、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.4

そのままで ワーニングは出る物のエラーにはなりませんね … プロジェクトの作成の仕方を間違えていないですか? 当方は 新規作成 > Win32 > Win32プロジェクト プロジェクト名などを決定して『アプリケーションの設定』で 『Windowsアプリケーション』『空のプロジェクト』 で作成 出来上がった ソリューションフォルダーに 解凍したソースをコピー IDEで プロジェクト > 既存の項目の追加で 『FileCopy.c』『FileCopy.h』『FileCopy.rc』を選択 といった手順で構築しました ワーニングは strcatやstricmpに関する物でした

その他の回答 (4)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.5

ひとつ書き忘れました ソースそのままの場合 文字セットの設定をUnicodeモードから MBCS(マルチバイト)モードに変更しました

mitarashi
質問者

お礼

試行までしていただき、ありがとうございました。 プロジェクトが沢山できるのが嫌で、複数のソースを#ifdefで囲ってプロジェクトファイルの使い回しをしておりました。ご指摘の通り、新規にプロジェクトを作成してビルドすると、ビルドできました。試しにソースの拡張子を変更してFileCopy.cppにすると、先のエラーが発生しました。この場合は、No.3のご回答にあった、 >『C コードとしてコンパイル (/TC)』に変更して リビルド すると、エラーが出なくなりました。 お手数をおかけして申し訳ありません。おかげ様で、ヘッダーファイルの中味について、少し勉強になりました。 もうしばらく置いてから、閉めさせていただきます。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

もしかすると、 全て CPP(C++)としてコンパイルしているのではないでしょうか プロジェクト > プロパティ > C/C++ > 詳細 を選択 『コンパイル言語の選択』の部分を確認してみましょう ここが 『C++ コードとしてコンパイル(/TP)』になっているなら 『C コードしてコンパイル (/TC)』に変更して リビルドしてみてください

mitarashi
質問者

お礼

追加情報ありがとうございました。 ご指摘の通り、元々拡張子がcのソースなのに、c++として扱っている事に原因があるのかと、当方でも__cplusplusと、CINTERFACEについて調べてみましたが、特に後者は意味が分かりませんでした。 さて、アドバイスいただいたオプションの変更を行ってみましたが、問題のエラーは消えず(エラー番号は変わりましたが)、別のエラーが増えてしまいました。 hoge.obj : error LNK2019: 未解決の外部シンボル _IMalloc_Free が関数 _FileCopy で参照されました。 C:\Documents and Settings\????\hoge.exe : fatal error LNK1120: 外部参照 1 が未解決です。 ご検討のほど、よろしくお願いいたします。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

PlatFormSDKをバージョンアップされてみてはいかがでしょう VS2005のヘルプで Win32 と COMの開発   PlatformSDK     Intoroduction のページの下部の方にある『See Also』の『Platform SDK Download site』のリンクからSDKのアップデートがダウンロード出来ますよ

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

PlatformSDKの objidl.hの1128行目で定義されていますよ

mitarashi
質問者

お礼

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

関連するQ&A

  • Relaeaeモードでビルドできない。

    こんにちは。皆様に教えて頂きたいのですが、いまDebugモードでビルドできているのですが、Releaseモードで同様にやると、「fatal error C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました」と出ます。そこで、 関係するsourceの*.cのヘッダーに#include "stdafx.h"を加えたところ、「fatal error C1853: 'Release/***.pch' プリコンパイルされたヘッダー ファイルは、このバージョンのコンパイラと互換性がありません。」とエラーが出ます。どこが間違っているのかお分かりの方教えて頂けませんでしょうか?よろしくお願いいたします。

  • Visual Studio2008でヘッダファイルが更新されない

    C++で、単純な計算プログラムを作成しています。 main.cとinit.hの2つのファイルで構成しています。2つとも、プロジェクトの親フォルダに入っています。 ヘッダファイルを変更して、ソリューションのリビルドをしても、ヘッダファイルの変更が反映されません。 構造体をヘッダファイルに記載していて、メンバを追加してリビルド後も反映されません。#defineでヘッダに記載していた定数を変数に変更しようとして、define文を消してリビルドしても、その値がずっと定数のままになってしまいます。 init.hファイルのファイル名をinit2.hに変更して、includeファイルも#include "init2.h"に書き換えてビルドすると反映されます。非常に不思議です。どこかVisual Studioの設定のような気がするのですが、環境設定の方法がわからず困っております。 どなたかご教示・ヒント・キーワード等よろしくお願いします。

  • C言語でヘッダファイルを自作する

    C言語で#defineを用いてヘッダファイルを作成したのですが、 作成したコンパイルするときにヘッダファイルがオープンできません。 参考にしている資料があるのですが、そこに書かれているサンプルプログラムを 丸ごとコピーして作ったプログラムも同様にヘッダファイルがオープンできない というエラーが出るので、ヘッダファイルを定義する方法そのものが間違っていると 思うのですが、どこが間違っているのでしょうか? よろしければ正しい記述方法もお教えください。 #include <stdio.h> #if !defined SAMPLE_H #define SAMPLE_H wa(int a, int b) { return a+b; } #endif #include "sample.h" int main(){ printf("%d\n",wa(40,70)); return 0; } ヘッダファイルの定義の方法は他にもあるとは思いますが、 今回は#defineを用いた方法でお願いします。

  • ヘッダファイルの2重のインクルードについて

    ある書物に「ヘッダファイルを複数回インクルードすると、それを”再定義”することによるエラーになる」と書いてありますたが、以下のようなヘッダファイルを作りそれを数回インクルードしても何ら異状が無くコンパイルできました。 math.h→ヘッダファイル名 #define max(a,b)  ((a)>(b)?(a):(b))→ヘッダファイルの内容 c ファイル #include<stdio.h> #include"math.h"←複数回インクルード #include"math.h"←複数回インクルード int main(void){ int x=1,y=2; printf("max(x,y)=%d\n",max(x,y)); return 0; } 環境としては、RedHat Linuxでviです。 何ゆえ、エラーにならないのか良く解りません。 宜しくお願いします。

  • 分割コンパイルの方法

    自作のクラスのメンバ変数にSTLのlistを使おうと考えています。 1ファイルでのコンパイルは通るのですが、以下のように分割コンパイルしようとすると、list<int> value; の行で以下のエラーが出ます。 listクラスではなく、別の自作のクラスをメンバ変数にして、そのクラスのヘッダーファイルをインクルードした場合は問題なくコンパイルできるので、何が問題なのか全く見当がつきません。どなたかご存知の方がおられれば解決法を教えていただけないでしょうか?よろしくお願いいたします。 error C2143: 構文エラー : ';' が '<' の前に必要です。 error C2501: 'list' : 識別名を宣言するのに、型が指定されていません。 error C2059: 構文エラー : '<' error C2238: ';' の前に不正なトークンがあります。 /* test.h */ #ifndef TEST_H_INCLUDED #define TEST_H_INCLUDED #include <list> class Test{ public: list<int> value; Test() {} }; #endif

  • Visual C++ 2008で<stdio.h>のインクルード文が使えない!?

    #include <stdio.h> int main(){ printf("hello!"); } で実行すると、 : warning C4627: '#include <stdio.h>': プリコンパイル済みヘッダーの使用を検索中にスキップされました ディレクティブを 'stdafx.h' に追加するか、プリコンパイル済みヘッダーをビルドし直します .\■■■.cpp(5) : fatal error C1010: プリコンパイル ヘッダーを検索中に不明な EOF が見つかりました。'#include "stdafx.h"' をソースに追加しましたか? と言ったエラーが起きてしまいます。 ちなみに、インクルードファイルらしき物を削除しまくった覚えがあります…。100%これが原因かと。 これが原因だとしたらどうすればいいんでしょうか? あと、DXライブラリが使えるように設定を変えたこともあります。 どこの何を変えたかは忘れてしまいましたけど。

  • C言語のヘッダーファイルについて

    宜しくお願い致します。 C言語について殆ど知識が無い為、変な質問でしたらすみません。 あるソースをビルドしてみたのですが、エラーが出てしまいます。 fatal error C1083: インクルード ファイルがオープンできません。'ヘッダーファイル名': No such file or directory このエラーが出るのは、以下のファイルです。 <sys/socket.h> <netdb.h> <netinet/in.h> <sys/param.h> <sys/uio.h> <unistd.h> これらのファイルは一体何処にあるのでしょうか。 どうすればこのエラーは消えるのでしょうか・・・

  • 複数ファイルに分割した時の構成について

    大学の卒論にむけてプログラムを書いていて、一つのmain.cでは長くなってきたので、関数を func1.h func1.c のような別ファイルに記述することにしました。 その現在の構成を、質問欄の下部に簡単に書いたので、構成が自然かどうか意見をお聞きしたいです。特に、 「include文、define文をヘッダファイルにまとめて、各ファイルからincludeしている構造」がコードの記述方法として、きもちわるくないか、一般的かどうか、教えてください。 このようにした理由は、 ・defineマクロを多くのサブ関数で利用している。 ・define定義の値を細かく変えながら実行し、結果の違いを出力したい。 ・その為、各ファイルの頭にdefine定義を置いた場合、定義の値を  いちいち全てのファイルで変更しなければならなくなり、面倒…。 →defineマクロをdefine.hにまとめた。ついでに、<stdio.h>,<math.h>なども置いてしまえばスッキリするかも~。 という経緯です。 理学の学科でまわりに詳しい人がいなく、 プログラム知識もほぼ独学なので、不安に感じて質問しました。 よろしくおねがいします。 +++++++++++++ 以下が、簡単なファイル構成です +++++++++++++ -----define.h----- #include <stdio.h> #include <math.h> #define A_MAX 3 #define B_MAX 5 -----main.c---- #include "define.h" int main() { func1(); func2(); func3(); } -----func1.h---- #include "define.h" void func1(int hoge); //プロトタイプ宣言 -----func1.c---- #include "func1.h" void func1() { hogehoge; } ------func2以下、func1と同構造

  • 他の.CPPファイルに定義した関数を呼び出す方法について

    新規作成したプロジェクトに、 以前自分が作成した.cppファイルと.hファイルを そのまま使えないかと考えています。 (※仮にそのファイルの名前を "define.cpp" "define.h" とします) プロジェクトに新規ファイル main.cpp を作成して、 define.hをインクルードし、 以下のようなテストのプログラムを組みました。 ・../util/define.cpp---------------------- #include <iostream> #include "define.h" void test(){ std::cout<<"test."<<std::endl; } ・../util/define.h------------------------ #pragma once void test(); ・main.cpp---------------------------- #include "../util/define.h" int main(){  test();  return 0; } 上記のソースを VisualC++7.0 でビルドすると、 main.cppの3行目で以下のようなエラーが出ました。 > LNK2019: 未解決の外部シンボル "void __cdecl test(void)" が関数 _main で参照されました VisualC++で「既存項目の追加」という項目より、 実体の定義されたdefine.cppをプロジェクトに追加していないため 当然といえば当然なのですが・・・ C言語でいうところの<stdio.h>等みたいに、 わざわざプロジェクトにCPPファイルを追加しなくても 関数を呼び出せるようには出来ないのでしょうか? 全ての関数と処理をヘッダーファイルに記述すると解決ですが 物凄く見辛いのでそれは避けたいのです。 また、色々なPC間で使っているため(学校のPCなので)、 ツール自体のプロパティを弄らない方法があるのでしたら、 多少面倒でもそちらの方が好ましいです。 追加する方法があるかどうか、 あればその方法をご存じでしたら教えていただければ嬉しいです。 よろしくお願いします。

  • CString: 識別子が見つかりません

    開発環境:Visual c++ 2008 Express Edion OS:Win XP Pro 次のエラーが表示されていて解決できません。 エラー内容は 1>d:\vc_source\dump\dump\Form1.h(448) : error C3861: 'CString': 識別子が見つかりませんでした です。 ちなみにinclude文は以下です。 #include <Windows.h> #include <stdio.h> #include <stdlib.h> #include <tchar.h> #include <string> #include <cstring> やりたいことは String型からCString型を経由して、TCHAR型へ変換することです。またはその逆方法の変換です。そのためにCString型は必要になるのですが、そこでコンパイルエラーになっています。 知っているかがおりましたら、教えて下さい。

専門家に質問してみよう