C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: VC++のクラスライブラリの作り方がわかりません!


(過去ログ 66 を表示中)

[トピック内 15 記事 (1 - 15 表示)]  << 0 >>

■38342 / inTopicNo.1)  VC++のクラスライブラリの作り方がわかりません!
  
□投稿者/ AziOGroup (1回)-(2009/07/11(Sat) 19:35:04)

分類:[C++/CLI] 

使用言語 C++/CLI(CLR)
使用IDE Visual Studio 2008 Professional

今、初めてC++/CLI(新規作成上では CLR)のクラスライブラリを使って、クラスをDLLにまとめていたのですが、
ふと気づいたのですが、
System::
まではアクセスできるのですが、
System::Windows
にアクセスできませんでした。
Windowsフォームアプリケーションでは利用できるので、そちらでクラスを作り、
比較してみたのですが、わかりませんでした。

仕方なくクラスライブラリの中身を空(新規作成の状態)にして、
他のWindowsフォームアプリケーションでインクルード(#include)しても、

error C2018: 文字 '0xe' は認識できません。

というようなエラーが大量127個も返されてしまい、まったくわからない状態です

・どのようにしたら System::Windowsにアクセスできるのか
・インクルードできないのはなぜなのか

上記のことを教えてくださると幸いです。
お願いします
引用返信 編集キー/
■38343 / inTopicNo.2)  Re[1]: VC++のクラスライブラリの作り方がわかりません!
□投稿者/ Jitta on the way (352回)-(2009/07/11(Sat) 20:17:41)
参照の追加
引用返信 編集キー/
■38345 / inTopicNo.3)  Re[2]: VC++のクラスライブラリの作り方がわかりません!
□投稿者/ やじゅ (1089回)-(2009/07/11(Sat) 20:53:05)
やじゅ さんの Web サイト
No38343 (Jitta on the way さん) に返信
> 参照の追加

ソリューションエクスプローラの[すべてのファイルを表示]ボタンをクリックします。
http://homepage1.nifty.com/rucio/main/kiso/Kiso13Reference.htm
引用返信 編集キー/
■38346 / inTopicNo.4)  Re[3]: VC++のクラスライブラリの作り方がわかりません!
□投稿者/ Azulean (415回)-(2009/07/11(Sat) 21:17:16)
No38345 (やじゅ さん) に返信
> ソリューションエクスプローラの[すべてのファイルを表示]ボタンをクリックします。
> http://homepage1.nifty.com/rucio/main/kiso/Kiso13Reference.htm
それはVBであって、VCではないですよ!

VCではプロジェクトのプロパティから、共通プロパティ - Frameworkと参照ノードから新しい参照を追加できます。
もしくはコード中で#usingディレクティブが使えるかどうかかなぁ。
引用返信 編集キー/
■38347 / inTopicNo.5)  Re[4]: VC++のクラスライブラリの作り方がわかりません!
□投稿者/ オショウ (267回)-(2009/07/11(Sat) 21:25:20)
> VCではプロジェクトのプロパティから、共通プロパティ - Frameworkと参照ノードから新しい参照を追加できます。
> もしくはコード中で#usingディレクティブが使えるかどうかかなぁ。

using namespace System::IO;

とかですネ!

※ 最近、C++/CLIにハマってます・・・

  ちゃんとVB/C#でできたことが、C++/CLIでも同様にできます。
  ただコーディング方法(語句とか)がCLI特有なだけです。

以上。
引用返信 編集キー/
■38348 / inTopicNo.6)  Re[4]: VC++のクラスライブラリの作り方がわかりません!
□投稿者/ やじゅ (1090回)-(2009/07/11(Sat) 21:47:57)
やじゅ さんの Web サイト
No38346 (Azulean さん) に返信
> ■No38345 (やじゅ さん) に返信
>>ソリューションエクスプローラの[すべてのファイルを表示]ボタンをクリックします。
>>http://homepage1.nifty.com/rucio/main/kiso/Kiso13Reference.htm
> それはVBであって、VCではないですよ!

VCなのは分かってたわけですが、VBもVCもIDEは同じかと思って・・・、
画像があるサイトを示したわけですが、違うんですね(^^;
引用返信 編集キー/
■38351 / inTopicNo.7)  Re[5]: VC++のクラスライブラリの作り方がわかりません!
□投稿者/ επιστημη (2053回)-(2009/07/11(Sat) 22:00:02)
επιστημη さんの Web サイト
リンク張っときますね。
http://okwave.jp/qa5117065.html

引用返信 編集キー/
■38352 / inTopicNo.8)  Re[5]: VC++のクラスライブラリの作り方がわかりません!
□投稿者/ Azulean (416回)-(2009/07/11(Sat) 22:07:58)
2009/07/11(Sat) 22:19:39 編集(投稿者)

No38347 (オショウ さん) に返信
>>もしくはコード中で#usingディレクティブが使えるかどうかかなぁ。
> using namespace System::IO;
> とかですネ!

違います。
それは名前空間に対するものであって、アセンブリの参照ではありません。
(このusing namespaceで済むのはアセンブリ参照が既に行われている場合に限られます)

私が言いたかったのは、#using <xxx.dll> という表記のものです。
http://msdn.microsoft.com/ja-jp/library/yab9swk4.aspx
引用返信 編集キー/
■38354 / inTopicNo.9)  Re[5]: VC++のクラスライブラリの作り方がわかりません!
□投稿者/ Azulean (417回)-(2009/07/11(Sat) 22:16:30)
2009/07/11(Sat) 22:18:10 編集(投稿者)

No38348 (やじゅ さん) に返信
> VCなのは分かってたわけですが、VBもVCもIDEは同じかと思って・・・、
> 画像があるサイトを示したわけですが、違うんですね(^^;

割と違うので、スクリーンショットありの既設サイトを見つけて提示するのは結構大変です。
というわけで、参考までに。

http://azulean.spaces.live.com/blog/cns!9E1932AF4BE9E15D!199.entry
↑リンクが途中で切れるのでコピペして下さい。
引用返信 編集キー/
■38355 / inTopicNo.10)  Re[6]: VC++のクラスライブラリの作り方がわかりません!
□投稿者/ オショウ (268回)-(2009/07/11(Sat) 23:29:22)
No38352 (Azulean さん) に返信
> 違います。
> それは名前空間に対するものであって、アセンブリの参照ではありません。
> (このusing namespaceで済むのはアセンブリ参照が既に行われている場合に限られます)

  そりゃ〜失礼!

以上。
引用返信 編集キー/
■38357 / inTopicNo.11)  Re[6]: VC++のクラスライブラリの作り方がわかりません!
□投稿者/ オショウ (269回)-(2009/07/12(Sun) 00:06:09)
お詫びに・・・

突っ込みどころ満載ですが、サンプルコードを少々・・・

プリンターとフォルダーを共有化/共有解除する機能をC++/CLIで作りました。

※ 以下、TestShare.h

// TestShare.h

#pragma once

#include	<windows.h>
#include	<winspool.h>
#include	<string>
#include	<stdlib.h>
#include	<string.h>
#include	<lm.h>

#pragma comment(lib,"winspool.lib")
#pragma	comment(lib,"netapi32.lib")

using namespace System;
using namespace	System::Runtime::InteropServices;
using namespace	System::Text;
using namespace	std;

namespace TestShare2 {

	public ref class SharePrinter
	{
		// TODO: このクラスの、ユーザーのメソッドをここに追加してください。
		public:
		    SharePrinter(){}
			~SharePrinter(){}
			!SharePrinter(){}
			System::Boolean	DoSharePrinterNT(String^ szPrinterName, String^ szShareName, System::Boolean bShare );
			System::Boolean IsSharedPrinter(String^ szPrinterName);
	};

	public ref class ShareDiskFolder
	{
		public:
		    ShareDiskFolder(){}
			~ShareDiskFolder(){}
			!ShareDiskFolder(){}
			System::Boolean DoShareDiskFolder(String^ szDiskFolderName, String^ szShareName, System::Boolean bShare);
			System::Boolean IsShareDiskFolder(String^ szShareName, String^ %szDiskFolderName);
	};
}

引用返信 編集キー/
■38358 / inTopicNo.12)  Re[7]: VC++のクラスライブラリの作り方がわかりません!
□投稿者/ オショウ (270回)-(2009/07/12(Sun) 00:07:04)
※ 以下、TestShare.cpp

#include "stdafx.h"

#include "TestShare.h"

namespace TestShare2 {

	static void	MarshalString(String^ s, wstring& os ){
		
		using namespace Runtime::InteropServices;
		const wchar_t* chars = (const wchar_t*)(Marshal::StringToHGlobalUni(s)).ToPointer();

		os = chars;
		
		Marshal::FreeHGlobal(IntPtr((void*)chars));
	
	}

	static void	MarshalString(wstring s, String^ %os){

		os = gcnew String(s.c_str ());

	}

	static System::Boolean	EnumShareFolder(wstring wszShareName, wstring& wszPath){

		System::Boolean	bRet;
		PSHARE_INFO_502 BufPtr,p;
		NET_API_STATUS	res;
		DWORD			er=0,tr=0,resume=0, i;

		do
		{
			res = NetShareEnum (NULL, 502, (LPBYTE *) &BufPtr, -1, &er, &tr, &resume);
			if(res == ERROR_SUCCESS || res == ERROR_MORE_DATA){
				p=BufPtr;
				bRet=false;

				for(i=1;i<=er;i++){
					if (p->shi502_netname == wszShareName){
						wszPath.assign (p->shi502_path );
						bRet=true;
						break;
					}
					p++;
				}

				NetApiBufferFree(BufPtr);

			}
		}while (res==ERROR_MORE_DATA);

		return bRet;

	}

	System::Boolean SharePrinter::IsSharedPrinter(String^  szPrinterName){

		System::Boolean		bRet;
		HANDLE				hPrinter;
		PRINTER_DEFAULTS	pd;
		DWORD				dwNeeded;
		PRINTER_INFO_2		*pi2;
		wstring				wszPrinterName;

		MarshalString(szPrinterName, wszPrinterName);

		ZeroMemory(&pd, sizeof(PRINTER_DEFAULTS) );
		pd.DesiredAccess = PRINTER_ALL_ACCESS;
		if(!OpenPrinter((LPWSTR)wszPrinterName.c_str () , &hPrinter, &pd ) ){
			return false;
		}
		if(!GetPrinter(hPrinter, 2, NULL, 0, &dwNeeded ) ){
			if(GetLastError() != ERROR_INSUFFICIENT_BUFFER ){
				ClosePrinter(hPrinter );
				return false;
			}
		}
		pi2 = (PRINTER_INFO_2 *)malloc(dwNeeded );
		if(pi2 == NULL ){
			ClosePrinter(hPrinter );
			return false;
		}
		if(!GetPrinter(hPrinter, 2, (LPBYTE)pi2, dwNeeded, &dwNeeded ) ){
			free(pi2 );
			ClosePrinter(hPrinter );
			return FALSE;
		}
		if ( (pi2->Attributes & PRINTER_ATTRIBUTE_SHARED) != PRINTER_ATTRIBUTE_SHARED)
			bRet = false;
		else
			bRet = true;

		free(pi2 );
		ClosePrinter(hPrinter );

		return bRet;
	}

	System::Boolean SharePrinter::DoSharePrinterNT(String^ szPrinterName, String^ szShareName, System::Boolean bShare ){

		HANDLE				hPrinter;
		PRINTER_DEFAULTS	pd;
		DWORD				dwNeeded;
		PRINTER_INFO_2      *pi2;
		wstring				wszPrinterName;
		wstring				wszShareName;

		MarshalString(szPrinterName, wszPrinterName);
		MarshalString(szShareName, wszShareName);

		ZeroMemory(&pd, sizeof(PRINTER_DEFAULTS) );
		pd.DesiredAccess = PRINTER_ALL_ACCESS;
		if(!OpenPrinter((LPWSTR)wszPrinterName.c_str () , &hPrinter, &pd ) ){
			return false;
		}
		if(! GetPrinter(hPrinter, 2, NULL, 0, &dwNeeded ) ){
			if(GetLastError() != ERROR_INSUFFICIENT_BUFFER ){
				ClosePrinter(hPrinter );
				return false;
			}
		}
		pi2 = (PRINTER_INFO_2 *)malloc(dwNeeded );
		if(pi2 == NULL ){
			ClosePrinter(hPrinter );
			return false;
		}
		if(! GetPrinter(hPrinter, 2, (LPBYTE)pi2, dwNeeded, &dwNeeded ) ){
			free(pi2 );
			ClosePrinter(hPrinter );
			return false;
		}
		if(bShare ){
			pi2->pShareName = (LPWSTR)wszShareName.c_str ();
			pi2->Attributes |= PRINTER_ATTRIBUTE_SHARED;
		} else {
			pi2->Attributes = pi2->Attributes & (~PRINTER_ATTRIBUTE_SHARED);
		}
		if(! SetPrinter(hPrinter, 2, (LPBYTE)pi2, 0 ) ){
			free(pi2 );
			ClosePrinter(hPrinter );
			return false;
		}
		free(pi2 );
		ClosePrinter(hPrinter );

		return true;
	}

	System::Boolean ShareDiskFolder::DoShareDiskFolder(String^ szDiskFolderName, String^ szShareName, System::Boolean bShare){

		System::Boolean	bRet;
		SHARE_INFO_2	share;
		DWORD			dwErr;
		NET_API_STATUS	res;
		wstring			wszShareName;
		wstring			wszFolderName;

		MarshalString(szShareName, wszShareName);

		if (bShare){
			MarshalString(szDiskFolderName, wszFolderName);

			ZeroMemory((void*)&share, sizeof(SHARE_INFO_2));

			share.shi2_netname      = (LPWSTR)wszShareName.c_str ();	// 共有名
			share.shi2_type         = STYPE_DISKTREE;			// ディスクドライブ
			share.shi2_remark       = (LPTSTR)L"";			// コメント
			share.shi2_permissions  = 0;
			share.shi2_max_uses     = SHI_USES_UNLIMITED;			// 無制限
			share.shi2_current_uses = 0;
			share.shi2_path         = (LPWSTR)wszFolderName.c_str ();	// フォルダのパス
			share.shi2_passwd       = NULL;				// パスワードなし

			dwErr = 0;

			bRet = IsShareDiskFolder(szShareName, szDiskFolderName);
			if (bRet)
				res = NetShareSetInfo(NULL, (LPWSTR)wszShareName.c_str () , 2, (LPBYTE)&share, &dwErr);
			else
				res = NetShareAdd(NULL, 2, (LPBYTE)&share, &dwErr);

		} else
			res = NetShareDel(NULL, (LPWSTR)wszShareName.c_str (), 0);

		if (res == NERR_Success )
			bRet = true;
		else
			bRet = false;

		return bRet;

	}

	System::Boolean ShareDiskFolder::IsShareDiskFolder(String^ szShareName, String^ %szDiskFolderName){

		System::Boolean bRet;
		NET_API_STATUS	res;
		SHARE_INFO_502	share;
		DWORD			dwType;
		wstring			wszShareName;
		wstring			wszFolderName;

		MarshalString(szShareName, wszShareName);

		ZeroMemory((void*)&share, sizeof(SHARE_INFO_502));

		dwType = 0;

		res = NetShareGetInfo(NULL, (LPWSTR)wszShareName.c_str (), 502, (LPBYTE*)&share);
		if ( res == NERR_NetNameNotFound || res == ERROR_INVALID_PARAMETER )
			bRet = false;
		else {
			bRet = EnumShareFolder(wszShareName, wszFolderName);
			if (bRet)
				MarshalString(wszFolderName, szDiskFolderName);
			bRet = true;
		}

		return bRet;

	}

}

引用返信 編集キー/
■38359 / inTopicNo.13)  Re[8]: VC++のクラスライブラリの作り方がわかりません!
□投稿者/ オショウ (271回)-(2009/07/12(Sun) 00:07:52)
作成したDLLを参照設定してください。

※ 以下、VB.NETのコード

Public Class Form1

#Region "Private Attributes"

Private objSharePrinter As TestShare2.SharePrinter
Private objShareDiskFolder As TestShare2.ShareDiskFolder

Private bChange As Boolean

#End Region

#Region "Private Form Event Functions"

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

GetPrinters()

objSharePrinter = New TestShare2.SharePrinter
objShareDiskFolder = New TestShare2.ShareDiskFolder

End Sub

Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing

objSharePrinter.Dispose()
objShareDiskFolder.Dispose()

End Sub

Private Sub btnPrinterShareCheck_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrinterShareCheck.Click

GetPrinterShareSetting(ComboBox1.Text)

End Sub

Private Sub btnPrinterShareExec_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrinterShareExec.Click

Dim bRet As Boolean

If RadioButton1.Checked Then
bRet = True
Else
bRet = False
End If

bRet = objSharePrinter.DoSharePrinterNT(ComboBox1.Text, PrinterShareName.Text, bRet)
If bRet Then
MsgBox("設定成功", MsgBoxStyle.Information Or MsgBoxStyle.OkOnly, "プリンタ共有設定")
Else
MsgBox("設定失敗", MsgBoxStyle.Exclamation Or MsgBoxStyle.OkOnly, "プリンタ共有設定")
End If

End Sub

Private Sub btnFolderSelect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFolderSelect.Click

Dim dRet As DialogResult

With FolderBrowserDialog1
.SelectedPath = Application.StartupPath
dRet = .ShowDialog
If dRet = Windows.Forms.DialogResult.OK Then
SelectFolder.Text = .SelectedPath
PrinterShareName.Text = String.Empty
End If
End With

End Sub

Private Sub btnFolderShareCheck_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFolderShareCheck.Click

If FolderShareName.Text = String.Empty Then
MsgBox("INPUT ShareName !!", MsgBoxStyle.Information Or MsgBoxStyle.OkOnly, "Folder Share Check")
Exit Sub
End If

SelectFolder.Text = String.Empty

GetFolderShareSetting(FolderShareName.Text, SelectFolder.Text)

End Sub

Private Sub btnFolderShareExec_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFolderShareexec.Click

Dim bRet As Boolean

If FolderShareName.Text = String.Empty Then
MsgBox("INPUT ShareName !!", MsgBoxStyle.Information Or MsgBoxStyle.OkOnly, "Folder Share Setting")
Exit Sub
End If

If RadioButton3.Checked Then
If SelectFolder.Text = String.Empty Then
MsgBox("SELECT Folder !!", MsgBoxStyle.Information Or MsgBoxStyle.OkOnly, "Folder Share Setting")
Exit Sub
End If
bRet = True
Else
bRet = False
End If

bRet = objShareDiskFolder.DoShareDiskFolder(SelectFolder.Text, FolderShareName.Text, bRet)
If bRet Then
MsgBox("設定成功", MsgBoxStyle.Information Or MsgBoxStyle.OkOnly, "フォルダー共有設定")
Else
MsgBox("設定失敗", MsgBoxStyle.Exclamation Or MsgBoxStyle.OkOnly, "フォルダー共有設定")
End If

End Sub

Private Sub btnQuit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnQuit.Click

Me.Close()

End Sub

Private Sub ComboBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.TextChanged

Dim cb As ComboBox

cb = DirectCast(sender, ComboBox)

If bChange = False Then
Exit Sub
End If

GetPrinterShareSetting(cb.Text)

End Sub

#End Region

#Region "Private Functions"

Private Sub GetPrinters()

bChange = False

ComboBox1.Items.Clear()

For Each s In System.Drawing.Printing.PrinterSettings.InstalledPrinters
ComboBox1.Items.Add(s)
Next s

bChange = True

End Sub

Private Sub GetPrinterShareSetting(ByVal szPrinter As String)

Dim bRet As Boolean

bRet = objSharePrinter.IsSharedPrinter(szPrinter)
If bRet Then
RadioButton1.Checked = True
RadioButton2.Checked = False
Else
RadioButton1.Checked = False
RadioButton2.Checked = True
End If

End Sub

Private Sub GetFolderShareSetting(ByVal szShareName As String, ByRef szDiskFolderName As String)

Dim bRet As Boolean

bRet = objShareDiskFolder.IsShareDiskFolder(szShareName, szDiskFolderName)
If bRet Then
RadioButton3.Checked = True
RadioButton4.Checked = False
Else
RadioButton3.Checked = False
RadioButton4.Checked = True
End If

End Sub

#End Region

End Class

以上。参考まで・・・
引用返信 編集キー/
■38361 / inTopicNo.14)  Re[7]: VC++のクラスライブラリの作り方がわかりません!
□投稿者/ Azulean (419回)-(2009/07/12(Sun) 00:38:31)
2009/07/12(Sun) 00:42:11 編集(投稿者)

No38357 (オショウ さん) に返信
> お詫びに・・・
> 突っ込みどころ満載ですが、サンプルコードを少々・・・
> プリンターとフォルダーを共有化/共有解除する機能をC++/CLIで作りました。

私見ですが、突っ込むとすれば、主題(C++/CLIでSystem::Windows名前空間が利用できない、インクルードでエラー)に対して過剰な情報ではないかという点です。
多くの部分が回答に必要(MUST)なソースであれば構わないと思いますが、どちらでも良い部分が多いとスレッドが長くなってしまい、読むのが大変と敬遠される可能性があります。
引用返信 編集キー/
■38365 / inTopicNo.15)  Re[8]: VC++のクラスライブラリの作り方がわかりません!
□投稿者/ AziOGroup (2回)-(2009/07/12(Sun) 11:21:23)
みなさん多数の返答ありがとうございます!
おかげで解決いたしました!
参照の追加方法も理解し、これで開発の再開が出来ます
本当に皆さんありがとうございました!
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -