柚と申します。
今、VC++6の環境で、APIのみでアプリケーションを作成しています。
その中で、
GetLongPathName() の機能を使用したかったのですが、標準ではWin98以上にしか対応していないので、
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/getlongpathname.asp
で
Windows NT and Windows 95:
Include an additional header file called NewAPIs.h to make GetLongPathName available on these operating systems.
とありますように SDKに含まれる NewAPIs.h を利用しようと思い、
本体のソースで
#include "NewAPIs.h"
し、StdAfx.h で
#define COMPILE_NEWAPIS_STUBS
#define WANT_GETLONGPATHNAME_WRAPPER
としました。
それでビルドしようとしたところ
newapis.h(325) : error C2440: '=' : 'int (__stdcall *)(const char *,char *,unsigned long)' から 'unsigned long (__stdcall *)(const char *,char *,unsigned long)' に変換することはできません。(新しい動作 ; ヘルプを参照)
この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。
とエラーします。
NewAPIs.hの中身は
http://sdks.icarusindie.com:2004/sdks//Platform%20SDK/installed/include/NewAPIs.h
で、エラー箇所は
GetLongPathName = RealGetLongPathName;
なのですが、
どのようにすれば正しく読み出せるか分かりますでしょうか?
どなたかよろしくお願いいたします。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/getlongpathname.asp
ここにパラメータが記述されていますが、見ていますか?
柚さんの使い方は明らかに間違っています。
> GetLongPathName = RealGetLongPathName;
DWORD GetLongPathName(
LPCTSTR lpszShortPath,
LPTSTR lpszLongPath,
DWORD cchBuffer
);
もう一度確認した上で、ソースを修正されるとよいでしょう。
間違っている点については御意なのですが、柚さんが間違っているのではなくて
Microsoft が提供している Platform SDK 中の NewAPIs.h が間違っているっぽいです。
バグレポート送りかなぁ。
NewAPIs.h 543 行 (手元のは)
BOOL (CALLBACK *RealGetPath... を
DWORD (CALLBACK *RealGetPath... に修正。
やはりバグでしたか・・。
MS製のヘッダは修正するものではない概念がありましたので、
ソースでなにかしら方法があるのだと思っていました。
http://www.winapi.net/index.php?inhalt=tipp13
でそれらしいお話をされていたのですが、
あいにく独語は読めず...(苦笑
BOOL (CALLBACK *RealGetLongPathName)(LPCTSTR, LPTSTR, DWORD);
をコメントアウトし
DWORD (CALLBACK *RealGetLongPathName)(LPCTSTR, LPTSTR, DWORD);
と宣言仕直すことで、
無事解決することができました。
ありがとうございました。
ツイート | ![]() |