1

Visual Studio 2010 (Windows フォーム) の SHGetFolderPathA に問題があります。プロジェクトに含めShlObj.h、ボタンにこのコードを追加しました:

char SciezkaCookies[MAX_PATH];
HRESULT hr = ::SHGetFolderPathA(0, CSIDL_APPDATA, 0, SHGFP_TYPE_DEFAULT, SciezkaCookies);

しかし、プロジェクトをコンパイルしようとすると、ビジュアルがエラーを返します:

エラー LNK2028: 未解決のトークン (0A000012) "extern "C" long stdcall SHGetFolderPathA(struct HWND *,int,void *,unsigned long,char *)" (?SHGetFolderPathA@@$$J220YGJPAUHWND__@@HPAXKPAD@Z) 関数で参照"private: void __clrcall VoxPopuli::Form1::start_Click(class System::Object ^,class System::EventArgs ^)" (?start_Click@Form1@VoxPopuli@@$$FA$AAMXP$AAVObject@System@@P$ AAVEventArgs@4@@Z)

1>VoxPopuli.obj : エラー LNK2019: 未解決の外部シンボル "extern "C" long stdcall SHGetFolderPathA(struct HWND *,int,void *,unsigned long,char *)" (?SHGetFolderPathA@@$$J220YGJPAUHWND__@@HPAXKPAD@Z ) 関数 "private: void __clrcall VoxPopuli::Form1::start_Click(class System::Object ^,class System::EventArgs ^)" で参照 (?start_Click@Form1@VoxPopuli@@$$FA$AAMXP$AAVObject@System @@P$AAVEventArgs@4@@Z)

Google で解決策を探していますが、すべての例が機能していません ;/

手伝ってくれてありがとう!

4

3 に答える 3

2

SHGetFolderPath() のようなネイティブの winapi 関数の呼び出しは、C++/CLI から問題なく実行できます。これはこの言語が得意とするところですが、リンカーを自分で満足させておく必要があります。この機能については、 MSDN ライブラリの記事を使用してください(今日ではなく、サイトは 1 週間ダウンしています)。記事の最後に「ヘッダー」がリストされています。これにより、shlobj.h についてコンパイラーに通知する必要があることがわかりました。また、「ライブラリのインポート」もリストされています。これは、リンカーに伝える必要があるものです。インポート ライブラリは、関数を呼び出すために実行時にどの DLL をロードする必要があるかをリンカに伝えます。

プロジェクト + プロパティ、リンカー、入力、追加の依存関係。「shell32.lib」を追加

または、リンク指示をリンカに渡す方法である #pragma を使用して、ソース コードで実行します。

#include <shlobj.h>
#pragma comment(lib, "shell32.lib")

これは間違いなく、他の誰かに対処してもらいたい API 関数の 1 つです。MSDN ライブラリの記事にも、関数が非推奨であると記載されていることに注意してください。Windows のバージョン間で、標準のフォルダー パスには多くの流動性があります。Environment::GetFolderPath() がこれを行います。また、さまざまな文字列タイプを処理する手間も省けます。

于 2012-06-16T15:09:29.503 に答える
0

.NET ソリューションが可能であれば、ネイティブ関数の使用は避けました。使ってみて

 Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData));

ネイティブと .NET の両方のアプローチについては、http: //bytes.com/topic/c-sharp/answers/269259-my-documents-path-cで説明しています。

于 2012-06-16T13:17:31.520 に答える
0

Windowsヘッダーを含めないように自分で宣言したに違いありません-私があなたを責めているわけではありません-しかし、名前が壊れているため、リンカーはネイティブライブラリから解決できません。

ああ、あなたは C++/CLI を使っていますか? おそらく、コンパイラはマネージ コードへのネイティブ呼び出しを好まないでしょう。

于 2012-06-16T11:25:40.163 に答える