C# パラメータが消える

このQ&Aのポイント
  • C#のLogin_Loadメソッドで変数がクリアされてしまう問題について解説します。
  • 共通変数クラスSystemStartDECを作成し、変数セットはできていますが、Login_Loadメソッドでは変数がクリアされてしまいます。
  • この問題の原因と解決方法について詳しく説明します。
回答を見る
  • ベストアンサー

C# パラメータが消える

以下の様に 共通変数クラスSystemStartDEC を作成し、変数セットまではできてますが Login_Loadでは変数がクリアされています。 なぜでしょうか? public Login() { InitializeComponent(); Login_Load(); this.BtnCancel.Click += new System.EventHandler(this.BtnCancel_Click); this.BtnLogin.Click += new System.EventHandler(this.BtnLogin_Click); } private void Login_Load() { string[] strParam; //iniファイル読込 if (InspecTool004_02.GetIni(this.lVerComVal) == false) { clsEnc.DeleteFile(strSettingIniName); MessageBox.Show("INIファイルの読み込みに失敗しました。" + "/r/n" + "終了します。"); return; } } public class InspecTool004_02 { class IniFileHandler { [DllImport("KERNEL32.DLL")] public static extern uint GetPrivateProfileString(string lpAppName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, int nSize, string lpFileName); [DllImport("KERNEL32.DLL", EntryPoint="GetPrivateProfileStringA")] public static extern uint GetPrivateProfileStringByByteArray(string lpAppName, string lpKeyName, string lpDefault, byte [] lpReturnedString, uint nSize, string lpFileName); [DllImport("KERNEL32.DLL")] public static extern uint GetPrivateProfileInt( string lpAppName, string lpKeyName, int nDefault, string lpFileName ); [DllImport("KERNEL32.DLL")] public static extern uint WritePrivateProfileString( string lpAppName, string lpKeyName, string lpString, string lpFileName); [DllImport("winmm.dll")] public static extern uint timeGetTime(); } //INIファイル読み込み public static Boolean GetIni(SystemStartDEC.strCom lVerComVal ) { StringBuilder sb_1 = new StringBuilder(1024); string strIniName ; string strBuffer ; Boolean bRtn ; strIniName = ".\\" + SystemStartDEC.strCom.SettingIniName; //DB Section IniFileHandler.GetPrivateProfileString("DB", "ConStr", "default", sb_1, sb_1.Capacity, strIniName); if( sb_1.ToString() == "default" ) { MessageBox.Show("SettingINIファイルDBセクションのConStrが読めません。"); return false; } lVerComVal.IniParam.DBStr = sb_1.ToString(); } public class SystemStartDEC { ////// <summary> ////// 全体共通 ////// </summary> ////// <remarks></remarks> public struct strCom { public strIniParam IniParam; public strUserInfo UserInfo ; public strDispInfo DispInfo ; public strMailInfo MailInfo ; } }

質問者が選んだベストアンサー

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

>共通変数クラスSystemStartDEC >を作成し、変数セットまではできてますが インスタンスはどこで生成しているのでしょうか? >Login_Loadでは変数がクリアされています。 「クリアされています。」とは、具体的にどの場所でどのようになっているのですか? # GetIni()内で設定しているのにコール元に戻ったら設定した値が無視されているよ~。 # ってコトであれば、おそらく正常動作ですが。 # refもoutもありませんし。 # http://msdn.microsoft.com/ja-jp/library/szasx730.aspx

yamayumi0001
質問者

お礼

ご指摘通り refを指定すると 思った通りに動きました 有難うございました。

関連するQ&A

  • C#でiniファイルの書き込みがうまくいきません。

    C#初心者です。今回INIファイルを生成→書き込みを行うためのソースコードを書いたのですが、空ファイルの生成はうまくいくのにINIファイルへの書き込みがうまくいかず、空ファイルのままになってしまいます。なぜでしょうか? 以下ソースコード using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; using System.Runtime.InteropServices; namespace Loei_Server_ { /* ネットで公開されていたINIファイルに関するクラス。 難しいことは考えちゃアカン。 */ class IniFileHandler { [DllImport("KERNEL32.DLL")] public static extern uint GetPrivateProfileString(string lpAppName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, uint nSize, string lpFileName); [DllImport("KERNEL32.DLL", EntryPoint = "GetPrivateProfileStringA")] public static extern uint GetPrivateProfileStringByByteArray(string lpAppName, string lpKeyName, string lpDefault, byte[] lpReturnedString, uint nSize, string lpFileName); [DllImport("KERNEL32.DLL")] public static extern uint GetPrivateProfileInt(string lpAppName, string lpKeyName, int nDefault, string lpFileName); [DllImport("KERNEL32.DLL")] public static extern uint WritePrivateProfileString( string lpAppName, string lpKeyName, string lpString, string lpFileName); } class Program { static void Main(string[] args) { /* 日付を取得。 */ DateTime this_time = DateTime.Now; /* 多重起動するとマズイので多重起動していたら強制的に終了する。*/ if (System.Diagnostics.Process.GetProcessesByName(System.Diagnostics.Process.GetCurrentProcess().ProcessName).Length > 1) { Console.WriteLine(" [Error] " + "[" + this_time.ToString() + "] Application already has started. This program is on the nature, you can not multi-boot."); return; } /* コンフィグデータの確認。なかったら勝手に生成する。 */ if (!File.Exists("Config.ini")) { Console.WriteLine(" [Warning] " + "[" + this_time.ToString() + "] Config.ini file could not be found. I created you."); /* 空のINIファイルを生成。 */ StreamWriter writer = new StreamWriter("Config.ini", true); /* 生成したINIファイルにいろいろ書き込む。 */ IniFileHandler.WritePrivateProfileString("Loei_Server_", "TCP_IP", "localhost", "Config.ini"); IniFileHandler.WritePrivateProfileString("Loei_Server_", "TCP_HOST", "25565", "Config.ini"); Console.WriteLine(" [Info] " + "[" + this_time.ToString() + "] It has generated an Config.ini file!"); }

  • C#のDllImportでuint型をどう指定すればいいのでしょうか?

    [DllImport("User32.dll")] public static extern IntPtr GetNextWindow(IntPtr hWnd,uint wCmd);の uint wCmdに GW_HWNDNEXTを指定したいのですがどのような 書き方で指定したらいいのでしょうか? よろしくお願いいたします

  • C# 他のアプリケーションから複数行取得

    C#で外部のアプリケーションのリッチテキストコントロールの複数行の文字列を取得したいです。 自分は下のコードを書いたのですが、これだと1行しか取得できませんでした。 どこが悪いでしょうか。 ここでは対象のアプリケーションをA、リッチテキストのコントロールをRichEditとします。 button1をクリックしたら、textbox1にRichEditの内容が表示されるようなものを作ろうとしています。 //ここから [DllImport("user32.dll", CharSet = CharSet.Auto)] static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll", SetLastError = true)] static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); [DllImport("user32.dll", CharSet = CharSet.Auto)] static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, int wParam, StringBuilder lParam); private const int WM_GETTEXT = 0x000D; private void button1_Click(object sender, EventArgs e) { IntPtr hWnd = FindWindow("A", ""); if (hWnd != null) { IntPtr hWndChild = FindWindowEx(hWnd, IntPtr.Zero, "RichEdit", ""); StringBuilder strBuilder = new StringBuilder(); SendMessage(hWndChild, WM_GETTEXT, strBuilder.Capacity, strBuilder); StringReader strReader = new StringReader(strBuilder.ToString()); string stResult = string.Empty; while (strReader.Peek() >= 0) { string stBuffer = strReader.ReadLine(); stResult += stBuffer + System.Environment.NewLine; } strReader.Close(); textbox1.Text = stResult; } }

  • C#からC++のDLLを使いたい時

    C#からC++(unmanaged)のDLLを使いたい時、 DLLをどのように参照すればよいのでしょうか。 [DllImport("名前.dll")] extern static double 関数名(); という指定は分かるのですが、 それだけじゃもちろん、 「DLL (名前.dll) を読み込めません。」 ってなりますよね・・・。

  • C#の仕様諸々について

    諸事情あって 数時間前 初めてC#の仕様に触れ、初めて実際にいじってみました。 で、細かいとこ全然違うなーとか思いながら 色々と考えてみたのですが とりあえずこれ CやC++での#include とかに当たるものが何も書かずに自動化されてる、ような感じでしょうか この仕様だと 数万行程度の規模のプログラムだったら良いかもしれませんが もっと増えて仮に10万行越えるとかくらいになってくると、開発環境がちゃんと反応できるか心配です。 そう言う場合って 仮に個人で作るとして 尚且つC++だったら普通動的ロードしないような必須機能であったとしても やっぱりアセンブリの分割を(別途dllに)するのが良いということになるのでしょうか? またinternalを使った場合 外部のアセンブリから使えない→開発環境に自動チェックされる量を減らせる と考えて良いのでしょうか? あるいは、C#は、もともとそこまでは大規模なプログラム向けの言語ではないのでしょうか? そんで、分割の時のことなんですが DllImportで 関数ポインタぽいものを作る時に (意味的に、C・C++でいう)ポインタを引数にとるって事が通常考えられるじゃないですか。 その時なんですけど using System; using System.Runtime.InteropServices; namespace WindowsFormsApplication1 { public partial class Form1 : System.Windows.Forms.Form { [DllImport( "kernel32.dll", CallingConvention = CallingConvention.StdCall )] extern static short QueryPerformanceCounter(ref long x); [DllImport("kernel32.dll", CallingConvention = CallingConvention.StdCall)] extern static short QueryPerformanceFrequency(ref long x); public Form1(){ InitializeComponent(); long cnt = 0, frq = 0; //(1) QueryPerformanceCounter(ref cnt); QueryPerformanceFrequency(ref frq); ・ ・ ・ どうやらこういう風に (1)のところで初期化がいると思うんですよね。 で、あきらかにこれ内部で書きかえられることを想定してるんだから 初期化なしでやりたいんですが 初期化なしでやる場合は outに変える必要があると聞きました。 [DllImport( "kernel32.dll", CallingConvention = CallingConvention.StdCall )] extern static short QueryPerformanceCounter(out long x); [DllImport("kernel32.dll", CallingConvention = CallingConvention.StdCall)] extern static short QueryPerformanceFrequency(out long x); ・ ・ ・ long cnt, frq; QueryPerformanceCounter(out cnt); QueryPerformanceFrequency(out frq); でもこの場合って、実際には中身は書き変えられないかもしれないですよね? その辺はDllImportの場合(自分のアセンブリ内のことしか)関知しないってことでしょうか? それから ・C++などでいうconst(C#ではメンバに付けるreadonly的)なローカル変数 ・同じく、constあるいはreadonly的な、関数への参照渡し(ref) といったものは言語仕様上ない、のでしょうか?

  • C#でウィンドウのアイコン取得する方法

    タスクマネージャのアプリケーションタブに 起動しているアプリケーション名とアイコンが一覧で表示されている部分のように 小さいアイコンを取得したいんですがなかなかうまくいきません。 ファイルに紐付くアイコンと解釈していただいても構いません。 とりあえず、下記のWin32 APIの処理を利用してみましたが SHGetFileInfoだけしかうまくいきませんでした。 しかし、SHGetFileInfoも、アイコンは取得できますがこれはファイルに紐付くアイコンではなく 実行体(EXE)に紐付くアイコンで表示されてしまいました。 開いているウィンドウ情報からだと実行プロセスのEXEのパスしか分からないからです。 ★質問★: ファイルに紐付く小さいアイコンの取得方法を教えてください!できればサンプルソース込みだと助かります。 #region 小さいアイコンを取得するためのWin32 API(ファイルパスから) // SHGetFileInfo関数 [DllImport("shell32.dll")] private static extern IntPtr SHGetFileInfo( string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags); // SHGetFileInfo関数で使用するフラグ private const uint SHGFI_ICON = 0x100; // アイコン・リソースの取得 private const uint SHGFI_LARGEICON = 0x0; // 大きいアイコン private const uint SHGFI_SMALLICON = 0x1; // 小さいアイコン private const uint SHGFI_TYPENAME = 0x400;//ファイルの種類 // SHGetFileInfo関数で使用する構造体 private struct SHFILEINFO { public IntPtr hIcon; public IntPtr iIcon; public uint dwAttributes; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] public string szDisplayName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)] public string szTypeName; }; #endregion #region 小さいアイコンを取得するためのWin32 API(ウィンドウハンドルからその1) [DllImport("user32.dll", EntryPoint = "GetClassLong")] public static extern IntPtr GetClassLongPtr32(IntPtr hWnd, int nIndex); [DllImport("user32.dll", EntryPoint = "GetClassLongPtr")] public static extern IntPtr GetClassLongPtr64(IntPtr hWnd, int nIndex); const int GCL_HICON = (-14); const int GCL_HICONSM = (-34); #endregion #region 小さいアイコンを取得するためのWin32 API(ウィンドウハンドルからその2) [DllImport("User32.dll", EntryPoint = "SendMessage")] public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam); public const int WM_GETICON = 0x7F; public const int WM_SETICON = 0x80; public const int ICON_SMALL = 0; public const int ICON_BIG = 1; #endregion

  • C# DLL エントリ ポイントが見つかりません。

    C#で作成したDLLをC#から呼出したいのですが、うまくいきません。 // トリガ private void button2_Click(object sender, EventArgs e) { string ans = DLL.moji(); MessageBox.Show(ans); } // DLL呼出し用クラス class DLL { [DllImport("LibCsharp.dll")] public static extern string moji(); } // DLL(LibCsharp.dll内容) class AddClass { public static string moji() { return ("テスト"); } } 上記で実行すると「EntryPointNotFoundException DLL 'LibCsharp.dll' の 'moji' というエントリ ポイントが見つかりません。」となります。 プロジェクトの参照設定にはLibCsharpを追加しています。 Web上で調べたのですが、解決には至っておりません。 申し訳ありませんが、よろしくお願いします。

  • C#からDLLを呼びたいのですが・・・

    C#のASP.NET WebアプリケーションのDLLをC#のWindowsFormのexeで呼び出そうとしています。 すると 'System.EntryPointNotFoundException' のハンドルされていない例外が FTPApi.exe で発生しました。 追加情報 : DLL SampleApi.dll の GetURL というエントリ ポイントが見つかりません。 というエラーメッセージが表示されてしまいます。 クラス上部で [System.Runtime.InteropServices.DllImport("SampleApi.dll", EntryPoint="GetURL")] public static extern string GetURL(); と宣言した後、呼び出したい場所で、 strUrlPath = GetURL(); と呼んでいます。 よろしくお願いします。

  • C#でアンマネージドの関数を呼ぶ時のLPBYTEの処理

    C#に首を突っ込み始めたばかりの初心者です。 VC++で使っていた関数をC#から使いたいのですが、四苦八苦しています。 引数としてLPBYTEをとるような関数ですが、C#からどのようにして呼べばいいのか困っています。呼ぶには呼ぶようですが、たぶんLPBYTEの処理がうまくいっていないので、例外処理されてしまいます。 ソースはこんな感じです。(途中、省略しています。) unsafe public class foo : ... { [DllImport("bar.dll")] private static extern int hoge(StringBuilder pBuf, int i); unsafe private void button(...) { StringBuilder pBuf = new StringBuilder(256*256); try { hoge(pBuf, 100); } catch{ ... } } } hogeの最初の引数が、LPBYTEだったところで、StringBuilderならいけるかなぁ、と思ってやってみたのですが、どうもダメっぽいです。おもいっきりcatchに入っていきます。 そもそも、C#でLPBYTEのような領域の扱いがわかっていないのがいけないのかもしれません... 素人の質問ですみません。

  • C++で作ったDLLをC#で使うには?

    C#でC++で書いたDLLを使いたいと思っていますが、可能でしょうか? 本で調べてみると出来ると思って挑戦しています。 public class Form1 : System.Windows.Forms.Form { [DllImport("test.dll")] public static extern long abc(); ..... と宣言し、使う時には long a = abc(); としています。 しかし、いざデバッグして実行してみると、エントリポイントが見つかりません。と表示されてしまいます。 (そもそもDLLが使えるのならばですが)できればC#でC++のDLLが使いたいため、詳しい方ご教授願います。

専門家に質問してみよう