GetLongPathName()のMS製wrapperを正しく読み込むには?

解決


  2004-10-22 11:25:29  No: 54849

柚と申します。

今、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;
なのですが、
どのようにすれば正しく読み出せるか分かりますでしょうか?

どなたかよろしくお願いいたします。


blackwind  2004-10-22 18:42:42  No: 54850

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
);

もう一度確認した上で、ソースを修正されるとよいでしょう。


tetrapod  2004-10-22 19:31:00  No: 54851

間違っている点については御意なのですが、柚さんが間違っているのではなくて
Microsoft が提供している Platform SDK 中の NewAPIs.h が間違っているっぽいです。

バグレポート送りかなぁ。

NewAPIs.h 543 行 (手元のは)
BOOL (CALLBACK *RealGetPath... を
DWORD (CALLBACK *RealGetPath... に修正。


  2004-10-23 00:30:21  No: 54852

やはりバグでしたか・・。

MS製のヘッダは修正するものではない概念がありましたので、
ソースでなにかしら方法があるのだと思っていました。

http://www.winapi.net/index.php?inhalt=tipp13
でそれらしいお話をされていたのですが、
あいにく独語は読めず...(苦笑

BOOL (CALLBACK *RealGetLongPathName)(LPCTSTR, LPTSTR, DWORD);
をコメントアウトし
DWORD (CALLBACK *RealGetLongPathName)(LPCTSTR, LPTSTR, DWORD);
と宣言仕直すことで、
無事解決することができました。

ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加