none
C++環境からのWindowsAzureのストレージへのアクセス法を教えていただけないでしょうか? RRS feed

  • 質問

  • C++環境からのWindowsAzureのストレージへのアクセス法を教えていただけないでしょうか?

    現在,VisualStudioのC++のwin32コンソールアプリケーションでソリューションを構築しているのですが,.netが使えないため,ストレージにアクセスできません.

    具体的には,win32コンソールアプリケーションから,画像をストレージ上にUploadしたいと思っています.

    そもそもWEBアプリケーションじゃない時点で無理なのでしょうか?

    何か良い方法をご存知の方いらっしゃればご教授いただけないでしょうか.

    宜しくお願いします.

    2011年4月1日 15:38

回答

  • こんにちは。

    絶対にWin32ネイティブコードでないとダメ、というのでなければマネージ拡張を利用してWindows Azure SDK に含まれるStorageClient等を参照すれば巷にあるBlobへのアクセスコードが使えます。

    例:

     

    #include "stdafx.h"
     
    using namespace System;
    using namespace System::Collections::Generic;
    using namespace System::Linq;
    using namespace System::Web;
    using namespace Microsoft::WindowsAzure;
    using namespace Microsoft::WindowsAzure::StorageClient;
    using namespace Microsoft::WindowsAzure::ServiceRuntime;
    using namespace System::IO;
     
    int main(array<System::String ^> ^args)
    {
        Console::WriteLine(L"Hello World");
    	CloudStorageAccount ^ account = CloudStorageAccount::Parse(L"UseDevelopmentStorage=true");
    	CloudBlobClient ^ blobclient = account->CreateCloudBlobClient(); //そんなメソッド無いって言われる・・・
    	CloudBlobContainer ^ blobContainer;
    	blobContainer = blobclient->GetContainerReference("code-recipe"); 
    	blobContainer->CreateIfNotExist(); 
    	
    	CloudBlob blobFile = blobContainer->GetBlobReference(L"code_recipe_hero2.jpg"); 
    	blobFile->UploadFromStream(/*アップロードするファイルのストリーム */);
    	
    	return 0;
    }
    

    ※Blobへのアクセス方法はコードレシピを参照しました

    ちょっとC2039なコンパイルエラーが解決していませんが…
    マネージ拡張した後はC++なコードで記述できますが、CLR使う作法に注意が必要ですね。(解放やらすっ飛ばしてるのでサンプルの出来がわるいです)

    MSDNにあるWindows AzureのClassライブラリリファレンスにはC++のコード片もあるので参考にされてはいかがでしょうか。

    http://msdn.microsoft.com/en-us/library/wl_svchosting_mref_reference_home.aspx

    またマネージ拡張がNGな場合、BlobはREST(HTTP)でアクセスできますので、bird982000さんが言われてるようにHTTP通信なプログラムを起こすことで対応できると思います。

    ちょっとサンプルの動作確認まで出来なくて申し訳ないですが…参考まで。

    2011年4月1日 17:42
    モデレータ
  • こんにちは。

    例えば、Blobを使うのであれば以下の二通りの方法があります。

    • REST APIで直接ストレージを操作する
    • Managed  APIを利用して、.NET(C#/VB/C++/CLI) から操作

    Managed APIを利用したとしても内部的にはREST APIを使っているのですが。

     

    で、手前味噌ではあるのですが、自分のBlogにC#を使ったBlobの操作方法をアップしてあります。

    ごらんになっていただくとわかりますが、ライブラリが充実したC#でもけっこう面倒くさいです。
    C++でどの程度クラスライブライリが用意されているか分からないのですが、似たようなことをすれば操作は可能です。

    C++/CLI を使えば NativeなC++と混在も出来たと思うので、Managed APIを利用したほうが簡単かと思います。

    .NETが使えないという要件がどの程度のものなのか分からないので、参考まで。


    2011年4月6日 13:12

すべての返信

  • こんにちは、

    私は通信関連のC++のAPI関連ははよくわからないのですが、APIは最終的にREST形式のHTTPメソッドでアクセスされます。

    ですので、直接HTTPでアクセスするようにがんばってライブラリを作っていけばなんとかなるのではと思います。

    RESTのAPIのリファレンスは以下になります。

    http://msdn.microsoft.com/en-us/library/dd179355.aspx

    ご参考まで

    2011年4月1日 16:38
  • こんにちは。

    絶対にWin32ネイティブコードでないとダメ、というのでなければマネージ拡張を利用してWindows Azure SDK に含まれるStorageClient等を参照すれば巷にあるBlobへのアクセスコードが使えます。

    例:

     

    #include "stdafx.h"
     
    using namespace System;
    using namespace System::Collections::Generic;
    using namespace System::Linq;
    using namespace System::Web;
    using namespace Microsoft::WindowsAzure;
    using namespace Microsoft::WindowsAzure::StorageClient;
    using namespace Microsoft::WindowsAzure::ServiceRuntime;
    using namespace System::IO;
     
    int main(array<System::String ^> ^args)
    {
        Console::WriteLine(L"Hello World");
    	CloudStorageAccount ^ account = CloudStorageAccount::Parse(L"UseDevelopmentStorage=true");
    	CloudBlobClient ^ blobclient = account->CreateCloudBlobClient(); //そんなメソッド無いって言われる・・・
    	CloudBlobContainer ^ blobContainer;
    	blobContainer = blobclient->GetContainerReference("code-recipe"); 
    	blobContainer->CreateIfNotExist(); 
    	
    	CloudBlob blobFile = blobContainer->GetBlobReference(L"code_recipe_hero2.jpg"); 
    	blobFile->UploadFromStream(/*アップロードするファイルのストリーム */);
    	
    	return 0;
    }
    

    ※Blobへのアクセス方法はコードレシピを参照しました

    ちょっとC2039なコンパイルエラーが解決していませんが…
    マネージ拡張した後はC++なコードで記述できますが、CLR使う作法に注意が必要ですね。(解放やらすっ飛ばしてるのでサンプルの出来がわるいです)

    MSDNにあるWindows AzureのClassライブラリリファレンスにはC++のコード片もあるので参考にされてはいかがでしょうか。

    http://msdn.microsoft.com/en-us/library/wl_svchosting_mref_reference_home.aspx

    またマネージ拡張がNGな場合、BlobはREST(HTTP)でアクセスできますので、bird982000さんが言われてるようにHTTP通信なプログラムを起こすことで対応できると思います。

    ちょっとサンプルの動作確認まで出来なくて申し訳ないですが…参考まで。

    2011年4月1日 17:42
    モデレータ
  • こんにちは。

    例えば、Blobを使うのであれば以下の二通りの方法があります。

    • REST APIで直接ストレージを操作する
    • Managed  APIを利用して、.NET(C#/VB/C++/CLI) から操作

    Managed APIを利用したとしても内部的にはREST APIを使っているのですが。

     

    で、手前味噌ではあるのですが、自分のBlogにC#を使ったBlobの操作方法をアップしてあります。

    ごらんになっていただくとわかりますが、ライブラリが充実したC#でもけっこう面倒くさいです。
    C++でどの程度クラスライブライリが用意されているか分からないのですが、似たようなことをすれば操作は可能です。

    C++/CLI を使えば NativeなC++と混在も出来たと思うので、Managed APIを利用したほうが簡単かと思います。

    .NETが使えないという要件がどの程度のものなのか分からないので、参考まで。


    2011年4月6日 13:12
  • 山形のohisamaです。がんばろう東北。

    興味があったので、cで検証しました。

    blobのコンテナリスト取得できました。

    ソースは500行くらいです。3日かかりました。

    osは、window2000、コンパイラは、lcc-win32です。

     

    2011年5月8日 2:24