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

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

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

Re[15]: ODBCデータソース構成ツール


(過去ログ 123 を表示中)

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

■73512 / inTopicNo.1)  ODBCデータソース構成ツール
  
□投稿者/ S.Kos (1回)-(2014/10/05(Sun) 11:19:23)

分類:[C/C++] 

みなさま、こんにちは。初めての投稿です。

MSDEの時代から無料(!)のSQLエンジンのお世話になっています。
ネットワークとは無縁の状態で、個々のPCにSQLエンジンを置いてODBCで接続、との形態です。

個々の環境でODBCデータソースが必要ですが、その都度手作業で、ってのも・・・・

そこで、MSDEのとき、VC6でツールを作りました。MFCなし、ゴリゴリのCです。
Win32APIのSQLConfigDataSource()を呼び出すもので、時代がSQLEXPRESSへと変わっても、そのまま動いています。

VC6によるこの手のツールが他にもあって、この度、その全てをVS2012環境で再構成しようとしています。
コンパイラとリンカのスイッチ設定に手間取りましたが、全てのツールで再ビルドに成功し、ひとつの例外を除いて、EXEファイルの動作も確認できました。

その例外がODBCデータソース構成ツールです。
どうやら、SQLConfigDataSource()の呼び出しに失敗しているらしい、とまでは判りましたが、解決策に至る道筋は全く見えません。

このことについて、ご教示いただければ幸いです。


引用返信 編集キー/
■73523 / inTopicNo.2)  Re[1]: ODBCデータソース構成ツール
□投稿者/ 774RR (181回)-(2014/10/06(Mon) 19:49:56)
回答にあらず

オイラを含めて、一般的にプログラマというのは推測とか憶測で動くのが嫌いです。
オイラの後輩君が「らしい」という報告持ってきたら突っ返します。

本当に失敗しているのか?
失敗しているとしたらその理由は?
あたりを調査できるのは当事者だけですので、後はがんばって調べてみてください。
# 我々第三者読者に「あなたのところで起きている状況」について尋ねられても困ります。
引用返信 編集キー/
■73524 / inTopicNo.3)  Re[1]: ODBCデータソース構成ツール
□投稿者/ 魔界の仮面弁士 (134回)-(2014/10/06(Mon) 20:11:15)
全角、半角の使い分けは適切に。

No73512 (S.Kos さん) に返信
> 個々の環境でODBCデータソースが必要ですが
アプリ側で DSN レス接続にするとか、ファイル DSN を使うといった回避は可能ですか?


> どうやら、SQLConfigDataSource()の呼び出しに失敗しているらしい、とまでは判りましたが、解決策に至る道筋は全く見えません。
API 経由ではなく、手動で作成するのであれば作成できるのでしょうか?

コマンドプロンプトから odbcconf を呼び出すとか、
管理ツールのデータソース(ODBC)経由で手動入力するなどで。

ODBC ドライバーのバージョンによって、接続文字列が異なるかも知れませんので…。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=27273&forum=7


あとは権限がらみでしょうかね。EXEを「管理者として実行」してみるなど。
それ以外だと、32bit/64bitの違いとか…?
引用返信 編集キー/
■73547 / inTopicNo.4)  Re[2]: ODBCデータソース構成ツール
□投稿者/ S.Kos (2回)-(2014/10/09(Thu) 09:31:04)
みなさま、ご教示のほど、ありがとうございます。

>アプリ側で DSN レス接続にするとか、ファイル DSN を使うといった回避は可能ですか?
>
今現在、200近い稼働数がありますので、この類の「回避策」を採りたくありません。

>管理ツールのデータソース(ODBC)経由で手動入力・・
>
ODBCアドミからの手入力によるDSN作成には問題ありません。
この「手入力」を避けたい、と考えています。

>あとは権限がらみでしょうかね。EXEを「管理者として実行」してみるなど。
>
これも試していますが、ダメでした。

>それ以外だと、32bit/64bitの違いとか…?
>
実はこれを疑っています。
けれども確信はなく、またそれを確かめる手法も判りませんでしたので、「らしい」と記しました。
なにかしら、ヒントでもいただければ、と思っていました。


開発環境は以下です。
 Panasonic Les'Note 64ビット機 + Windws/8.1
 VSExpress2012 for WindowsDesktop


ソースのコアは以下です。
起動時のスイッチによる構成箇所がありますが、おそらく無関係でしょう
//////////////////////////////////////////////////////////////////////////////
// ODBCデータ・ソース作成
//
static char szDsnTop[] = "DSN=hogehoge";

static char szDsnMid[512];
static char szDsnTail[1024];
static char szDsnTailA[] ="Trusted_Connection=no";
static char szDsnTailB[] ="DATABASE=foo";

static char szSqlAttribute[1024]; // SQL属性

////
// ODBCデータ・ソース作成
BOOL MakeUpODBC_DSN( void )
{
BOOL bRet = FALSE;
char *sP, *dP;

SWORD DsnMode;

// サーバー名決定
lstrcpy( szDsnMid, "SERVER=" );
lstrcat( szDsnMid, szServerName );
lstrcat( szDsnMid, "\\honyarara");

// DSN決定
dP = szDsnTail; sP = szDsnTailA; // Trusted_・・・
while( *sP != '\0' ) {
*dP = *sP; sP++; dP++;
}
*dP = '\0'; dP++;

sP = szDsnTailB; // DATABASE = ・・・・・
while( *sP != '\0' ) {
*dP = *sP; sP++; dP++;
}
sP = szDSNeXtention; // Extention
while( *sP != '\0' ) {
*dP = *sP; sP++; dP++;
}
*dP = '\0'; dP++; *dP = '\0'; dP++; *dP = '\0';

// SQL属性文字列作成
dP = szSqlAttribute; sP = szDsnTop; // DSN =・・・
while( *sP != '\0') {
*dP = *sP; sP++; dP++;
}
*dP = '\0'; dP++;

sP = szDsnMid; // SERVER=・・・
while( *sP != '\0') {
*dP = *sP; sP++; dP++;
}
*dP = '\0'; dP++;

// DATABASE=・・・
sP = szDsnTail; DsnMode = ODBC_ADD_SYS_DSN;

while( 1 ) {
if( *sP == '\0' && *(sP+1) == '\0' ) break;
*dP = *sP; sP++; dP++;
}
*dP = '\0'; dP++; *dP = '\0';

bRet = SQLConfigDataSource( NULL, DsnMode, "SQL Server", szSqlAttribute ); <--
return bRet;
}


ビルドに成功したので、成果物(.EXE)をターゲットマシン(Win7/32bit機)で走らせると、
bRet = FALSE が返ってきました。

SQLConfigDataSource がおかしい、としか考えられません。
あちこち彷徨ったのですが、手かがりを掴めませんでした。

この時点で、先の投稿に至った次第です。

重ねてご教示いただければ幸いです。


引用返信 編集キー/
■73548 / inTopicNo.5)  Re[3]: ODBCデータソース構成ツール
□投稿者/ 魔界の仮面弁士 (139回)-(2014/10/09(Thu) 10:25:33)
No73547 (S.Kos さん) に返信
> 開発環境は以下です。
>  Panasonic Les'Note 64ビット機 + Windws/8.1
>  VSExpress2012 for WindowsDesktop
スペルがあやしいですが、それはさておき。


>> コマンドプロンプトから odbcconf を呼び出すとか、
>> 管理ツールのデータソース(ODBC)経由で手動入力するなどで。
> ODBCアドミからの手入力によるDSN作成には問題ありません。
> この「手入力」を避けたい、と考えています。

odbcconf はどうだったのでしょうか?
odbcconf が使えるのであれば、それを呼び出すバッチファイルを
用意するのが、作業としては手軽かと思います。


> >それ以外だと、32bit/64bitの違いとか…?
> 実はこれを疑っています。
実行環境の OS が 32bit なのか 64bit なのかは確認されましたでしょうか。
(32bit の ODBC 設定と 64bit の ODBC 設定は別々に存在しています)

仮に 64bit OS だとした場合、アプリ自体は 32bit アプリとしてビルドされたものでしょうか?
x64 ビルドと Win32 ビルドかで影響が出るのか、確認した方が良いかもしれません。


> なにかしら、ヒントでもいただければ、と思っていました。
私自身は、unsafe C# の読み書きならできるのですが、
C/C++ は専門外なので、具体的な点は指摘できなかったりします…。


-----------------
ところで、ここの掲示板に投稿する際には、下記の注意書きがあったかと思います。

 ・半角カナは使用しないでください。文字化けの原因になります。

実際、過去にも文字化け(その時は題名部)の問題が発生した事がありますので、
次回以降の投稿では、半角カナを含めることがないようご留意下さい。
引用返信 編集キー/
■73550 / inTopicNo.6)  Re[4]: ODBCデータソース構成ツール
□投稿者/ 774RR (183回)-(2014/10/09(Thu) 12:04:40)
'\0' を途中に含む文字列 (終端は \0\0 ダブル NUL) を結合で作ってるわけか・・・
SZ 文字列が複数個連結したもの、ってことね。

現コードはかっこ悪すぎ、可読性0なので修正しようよ。
memcpy でもいいし strcpy でもいいし・・・
そもそも接続文字列が固定ならこんな結合処理はまったく要らないよ。

単に「失敗した」で終わらずに、その原因を調べておくれ、と書いたとおりで

szSqlAttribute に期待通りの文字列(というか文字列の列)が構成されているかチェック
(デバッガでダンプ)

http://msdn.microsoft.com/en-us/library/ms716476.aspx
Diagnostics に従いトラブルシューティングしてみてほしい。

引用返信 編集キー/
■73551 / inTopicNo.7)  Re[5]: ODBCデータソース構成ツール
□投稿者/ S.Kos (3回)-(2014/10/09(Thu) 13:08:49)
重ねてのご教示、感謝です。

ソースに含まれていた半角カタカナを、そのままコピーしてしまいました。ご容赦!


さて、実のところ「ビット」が不具合の根っこでは、とも思っています。
先に記すとおり、
 開発環境 → 64ビット機 + Windws/8.1
 ターゲット→ Win7/32bit機
です。

けれども、コンパイラのプロジェクト設定でプラットフォームがWin32となっているので、問題ないか、とも・・・・

最初の投稿で「らしい」と記した背景のひとつでもあります。


上に「ターゲット=32ビット機」と記していますが、64ビット機も想定せねばならず、この場合WOW64上のODBCアドミが必要であることも承知しています。

手作業を避けたい、との思惑の一端が、ここにあります。


odbcconfは、未だ試していません。
これが、純粋(?)32ビット環境とWOW64環境を識別してODBCアドミを起動できるなら、それで目的は達成できます。


確かに接続文字列の構成は、カッコ良いものではありませんが、完全な固定文字列でもないため、このようなコトになってしまいました。

訳あって、DB実体のインスタンスが異なる名前だったり、DBそのものの名前が異なったりします。これらを起動時のスイッチで取得・構成しています。

このコード自体は、VC6では全く問題のない成果物(.EXE)を得ていますので、期待する「文字列の列」(←言い得て妙!)が構成できている、と考えています。

重ねてご教示いただければ幸いです。


引用返信 編集キー/
■73552 / inTopicNo.8)  Re[6]: ODBCデータソース構成ツール
□投稿者/ 魔界の仮面弁士 (140回)-(2014/10/09(Thu) 13:41:12)
No73551 (S.Kos さん) に返信
> odbcconfは、未だ試していません。
> これが、純粋(?)32ビット環境とWOW64環境を識別してODBCアドミを起動できるなら、それで目的は達成できます。

Odbcad32.exe と同様に、odbcconf.exe もまた、64bit環境では
 C:\Windows\System32\ODBCCONF.EXE (64bit)
 C:\Windows\SysWOW64\ODBCCONF.EXE (32bit)
として、別々に存在しています。
引用返信 編集キー/
■73560 / inTopicNo.9)  Re[7]: ODBCデータソース構成ツール
□投稿者/ S.Kos (4回)-(2014/10/10(Fri) 10:28:24)
みなさま、ご教示のほど、ほんとうにありがとうございます。

下記VBSを書いて(Win8.1 64ビット機で)試したところ・・・

''''''''''''''''''''''''''
strDSN = "hogeDSN"
strDATABASE = "hogeDB"
strSERVER = "hogeINSTANCE"

strCommand = "odbcconf.exe /A {CONFIGDSN ""SQL Server"" " <-※※
strCommand = strCommand & "DSN=" & strDSN
strCommand = strCommand & "|DATABASE=" & strDATABASE
strCommand = strCommand & "|SERVER=" & strSERVER
strCommand = strCommand & "}"

Set objShell = WScript.CreateObject("WScript.Shell")
objShell.CurrentDirectory = "C:\Windows\SysWOW64\"

objShell.Run strCommand,,True
''''''''''''''''''''''''''

新たな疑問が二つ顕れました。

1.上記コードは無事に完了します。
  32ビット版ODBCアドミを立てると、データソース"hogeDSN"のプラットフォームに"32/64ビット"と表示されます。
  これは32,64共に作成された、ということでしょうか?
  そうであるなら、obdcconf.exeが二つあることの意味は?

2.上記※※で、CONFIGDSNをCONFIGSYSDSNとして、システムDSNを作ろうとすると、失敗します。
  アドミで入っているのですが、なにかしらユーザー権限が絡んでいるように思います。

重ねてご教示いただければ幸いです。

引用返信 編集キー/
■73563 / inTopicNo.10)  Re[8]: ODBCデータソース構成ツール
□投稿者/ 魔界の仮面弁士 (141回)-(2014/10/10(Fri) 12:10:08)
No73560 (S.Kos さん) に返信
> これは32,64共に作成された、ということでしょうか?
obdcad.exe から手動で作成した場合も、ユーザーDSN のページには
32bit ドライバー向けのエントリーと 64bit ドライバー向けのエントリーが
併記されてはいませんでしたか?


> obdcconf.exeが二つあることの意味は?
32bit / 64bit の両方をサポートしている ODBC ドライバーがある一方で、
32bit 版のみをサポートするものや、64bit 版のみのドライバーも存在するためです。

たとえば、ACE 系の ODBC ドライバーなら 32bit 版も 64bit 版も存在しますが、
JET 系の ODBC ドライバーには、64bit 版が無いですよね。


> アドミで入っているのですが、なにかしらユーザー権限が絡んでいるように思います。
コマンドプロンプトを右クリックし、「管理者として実行」を選んでから起動されていますか?
(ログオンユーザーが Administrators かどうかとは別問題)
引用返信 編集キー/
■73565 / inTopicNo.11)  Re[9]: ODBCデータソース構成ツール
□投稿者/ S.Kos (5回)-(2014/10/10(Fri) 12:36:24)
No73563 (魔界の仮面弁士 さん) に返信
繰り返しの手解き、ありがとうございます。

>obdcad.exe から手動で作成した場合も、ユーザーDSN のページには・・
>
確かに!
ユーザーDSNだと、手作業でも、WOW64側で作ったものが、64ビット側で見えてますね!
これまで、システムDSN以外を扱っていなかったので、これに気付きませんでした。

>コマンドプロンプトを右クリックし、「管理者として実行」を選んでから起動されていますか?
>
手元の環境では、Win7機、Win8.1機、ともに右クリック後の「管理者として実行」がありません。
アドミで入ってるからだろう・・・と思っていましたが、そうではないのですね?

なぜ、右クリック後の「管理者として実行」、が無くなっているのでしょう??

次々とモンダイが顕在化します。重ねてご教示いただければ幸いです。

引用返信 編集キー/
■73568 / inTopicNo.12)  Re[10]: ODBCデータソース構成ツール
□投稿者/ 魔界の仮面弁士 (142回)-(2014/10/10(Fri) 16:13:53)
2014/10/10(Fri) 16:14:26 編集(投稿者)

全角、半角の使い分けは適切に。

No73565 (S.Kos さん) に返信
> これまで、システムDSN以外を扱っていなかったので、これに気付きませんでした。
これらのツールで、ユーザーDSNやシステムDSNを登録できるようであれば、
C からでも同じことはできそうですね。文字列にミスがあるとか権限不足とかで無ければ。

最初の EXE にて、マニフェストで
 <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
を指定しておいた場合、動作に変化はありますか?


>> コマンドプロンプトを右クリックし、「管理者として実行」を選んでから起動されていますか?
> 手元の環境では、Win7機、Win8.1機、ともに右クリック後の「管理者として実行」がありません。
コマンドプロンプトを、「管理者として実行」を指定して起動した場合、
ウィンドウタイトルは『管理者: コマンド プロンプト』となります。


> アドミで入ってるからだろう・・・と思っていましたが、そうではないのですね?
Vista 以降、UAC が有効な状態のままにしてあるのであれば、
管理者アカウントでログインしているどうかは関係無いはずです。

あくまでも、ショートカットファイルや EXE を「管理者として実行」したかどうかが問題です。
(この点は、最初の No73524 で起動される EXE に対しても同じことです)

ポリシー設定にて、管理者のみ UAC を無効にするとか、
全ユーザーでUACにするといった設定にすることはできますが、
UAC をオフにして運用しているわけではないのですよね。


> なぜ、右クリック後の「管理者として実行」、が無くなっているのでしょう??
確認している箇所が違うか、UAC をオフにしているのかのいずれかだと思います。

[Win]キーを押してメニューを開き、そのまま続けて、キーボードから [C] [M] [D] の 3 文字を入力し、
その後で [Shift]+[Enter]した場合も、管理者コマンドプロントが呼び出されるはずですが、
それでも駄目でしょうか。
引用返信 編集キー/
■73570 / inTopicNo.13)  Re[11]: ODBCデータソース構成ツール
□投稿者/ S.Kos (6回)-(2014/10/11(Sat) 10:16:47)
No73568 (魔界の仮面弁士 さん) に返信
とんでもない勘違い(あるいは読み違い)をしていました。
「コマンドプロンプト」と「VBS」を同一視してしまってました。

73565に記した”右クリック後の「管理者として実行」がない”は、VBSに対して、でした。

そもそも初めッからから、VBSを「管理者として実行」することなど、想定されていないのですね!

なにはともあれ、下記コードに辿り着きました。
手元の環境(32bit/64bit)では、このスクリプトのダブルクリックで、巧く動きました。

繰り返しご教示いただいた魔界の仮面弁士さんには、改めて御礼申し上げます。
ほんとうにありがとうございました。

いま暫く開いたままにします。
見落としなど、重ねてご指摘いただければ幸いです。


'''''''''''''''''''''''''''''''''''''''''''''''''''''''
' SetupODBC.vbs
'
' 32bit/64bit 環境に応じてODBC・DSNを構成
' VBSを管理者として実行
'
'''''''''''''''''''''''''''''''''''''''''''''''''''''''
Option Explicit

Dim objShell, objShellApp
Dim strMode, strDSN, strDATABASE, strSERVER, strCommand

''' DSN定義
strDSN = "hogeDSN"
strDATABASE = "hogeDB"
strSERVER = "hogeINSTANCE"

strCommand = "odbcconf.exe /A {CONFIGSYSDSN ""SQL Server"" "
strCommand = strCommand & "DSN=" & strDSN
strCommand = strCommand & "|DATABASE=" & strDATABASE
strCommand = strCommand & "|SERVER=" & strSERVER
strCommand = strCommand & "}"

''' 管理者として実行
do while WScript.Arguments.Count = 0
Set objShellApp = CreateObject("Shell.Application")
objShellApp.ShellExecute "wscript.exe", """" & WScript.ScriptFullName & """ uac", "", "runas"

WScript.Quit
loop

''' DSN構成実体
Set objShell = WScript.CreateObject("WScript.Shell")

'' X64 or X86 ?
strMode = objShell.Environment("Process").Item("PROCESSOR_ARCHITECTURE")
If UCase(strMode) = "X86" Then
WScript.Echo "32ビット環境で構成します"
objShell.CurrentDirectory = "C:\Windows\System32\"
Else
WScript.Echo "WOW64環境で構成します"
objShell.CurrentDirectory = "C:\Windows\SysWOW64\"
end if

'' 実行
objShell.Run strCommand,,True

'''
WScript.Echo " ODBC/DSN " & strDSN & " を構成しました"

''' file end '''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''



引用返信 編集キー/
■73572 / inTopicNo.14)  Re[12]: ODBCデータソース構成ツール
□投稿者/ 魔界の仮面弁士 (144回)-(2014/10/11(Sat) 16:26:21)
全角英数字と半角英数字の使い分けは適切に。


No73570 (S.Kos さん) に返信
> いま暫く開いたままにします。
当初の「SQLConfigDataSource が期待動作しない件」が
放置されたままですが、原因を特定しなくて良いのでしょうか?


> 73565に記した”右クリック後の「管理者として実行」がない”は、VBSに対して、でした。

なるほど、.VBS ファイルを右クリックされていたのですね。(^^;

.XLS / .XLSX ファイルや、.JPG / .JPEG ファイルを右クリックしても管理者として実行は出来ないのと同様、
データファイルやスクリプトではなく、アプリケーション本体あるいは呼び出し元を管理者実行する必要があります。


VBScript の実行ホストは、他にもいろいろありますが(HTA、HTML、ASP、WSC、HTC、ScriptControl 等々)、
今回のホストとなるのは
 CScript.exe
もしくは
 WScript.exe
ですね。もちろん、それらを呼び出すコマンドプロンプトを管理者実行しても OK です。


当初私が odbcconf.exe を提案した段階では、*.cmd あるいは *.bat からの呼び出しを
想定していたのですが、*.vbs からの呼び出しでも同じことですね。


> ' 32bit/64bit 環境に応じてODBC・DSNを構成
この冒頭のコメントは「32bit の ODBC・DSN を構成」の方が良いと思います。

今回提示されているサンプルは、
 64bit ネイティブ環境では、「32bit の ODBC 設定を行う」
 32bit ネイティブ環境では、「32bit の ODBC 設定を行う」
 WOW64 環境においては、「32bit の ODBC 設定を行う」
になるわけですから。


ところでこれを、64bit 設定を行う為に、
 64bit ネイティブ環境では、「64bit の ODBC 設定を行う」
 32bit ネイティブ環境では、非対応としてメッセージ出力
 WOW64 環境においては、「64bit の ODBC 設定を行う」
という動作にする場合、コードをどのように修正すべきかは把握されていますか?


> ' VBSを管理者として実行
runas 指定の呼び出しは、もっと冒頭に置いた方が良いかな…。
まぁ、strCommand の後でも前でも、動作的には大差ないのですが。
引用返信 編集キー/
■73576 / inTopicNo.15)  Re[13]: ODBCデータソース構成ツール
□投稿者/ S.Kos (7回)-(2014/10/12(Sun) 09:30:15)
No73572 (魔界の仮面弁士 さん) に返信
重ねての手解き、誠にありがとうございます。

> 当初の「SQLConfigDataSource が期待動作しない件」が・・
これ(73512)を記す元となったODBCデータソース構成ツールは、ご教示いただいた obbcconf.exe の、極一部の機能と同等です。
obbcconf.exeの存在を知らなかったため、コレを企てたのですが、いまとなっては無用の長物です。
SQLConfigDataSourceの動作に関わる、単なる「プログラマーとしての興味」は残りますが・・・時間が・・・

> この冒頭のコメントは「32bit の ODBC・DSN を構成」の方が良いと思います。
御意! 早速、修正しました。

> ところでこれを、64bit 設定を行う為に
> ・・
> という動作にする場合、コードをどのように修正すべきかは把握されていますか?
このモンダイに思い至りもしませんでした。
私が扱う環境は、いま暫くの間、64bitネイティブにほど遠いでしょう。
けれど、いずれ来るその時に備えて、重ねてご教示いただければ幸いです。

> runas 指定の呼び出しは、もっと冒頭に置いた方が良いかな…。
この手のループをどこに置くか? ってのは、Cで書くWinmainのように、ある種の「お作法」でしょう。
記したコード自体はあちこち彷徨った成果ですが、殆どが断片的な情報で、全景を見渡せるものがありませんでした。
世の大勢の「お作法」があれば、是非ご教示ください。

引用返信 編集キー/
■73577 / inTopicNo.16)  Re[14]: ODBCデータソース構成ツール
□投稿者/ 魔界の仮面弁士 (145回)-(2014/10/12(Sun) 13:19:56)
繰り返しになりますが、半角カナの投稿は控えてください。また混入していますよ。

■No73576 (S.Kos さん) に返信
> SQLConfigDataSourceの動作に関わる、単なる「プログラマーとしての興味」は残りますが
どの段階まで調査されたのかが良くわからなかったのですが、
「管理者として実行していなかった」というわけでもなく、また、今回の実行環境において、
文字列の内容が意図せず変質してしまっていた…という訳でもないのですね?


> 私が扱う環境は、いま暫くの間、64bitネイティブにほど遠いでしょう。
> けれど、いずれ来るその時に備えて、重ねてご教示いただければ幸いです。
本題からは外れますが、蛇足情報として:


32bit アプリの起動を目的とするなら、環境変数 PROCESSOR_ARCHITECTURE の判定だけでも良いですが、
64bit アプリの起動を目的とする場合には、それだけでは不十分です。システムフォルダを
正しく扱うためには、WOW64 動作になっていないかどうか、見極めが必要になります。


環境変数 PROCESSOR_ARCHITECTURE が "x86" を返してきた場合には、WOW64 動作の可能性があるため、
環境変数 PROCESSOR_ARCHITEW6432 も追加調査が必要であるという事です。

┏━━━━━━━━━━━┳━━━━━━━━━┯━━━┯━━━━━━━━━┓
┃      環境変数        ┃       64bit      │ 32bit│       WOW64      ┃
┣━━━━━━━━━━━╋━━━━━━━━━┿━━━┷━━━━━━━━━┫
┃PROCESSOR_ARCHITECTURE┃AMD64 または IA64 │           x86            ┃
┠───────────╂─────────┴───┬─────────┨
┃PROCESSOR_ARCHITEW6432┃        (未定義)          │AMD64 または IA64 ┃
┗━━━━━━━━━━━┻━━━━━━━━━━━━━┷━━━━━━━━━┛


64bit プロセスのコマンドプロンプトの場合、そのまま
C:\Windows\System32\ は 64bit 用のフォルダとなり、
C:\Windows\SysWOW64\ は 32bit 用のフォルダとなるわけですが、
これが WOW64 のコマンドプロンプトとなると意味が変わってきます。

64bit OS 上で、32bit 版のコマンドプロンプト(C:\Windows\SysWOW64\cmd.exe)を
実行した場合、C:\Windows\System32\ も C:\Windows\SysWOW64\ のいずれもが、
共に 32bit 用のフォルダを指し示す仕様です。いわゆるファイル システム リダイレクタです。

そして、WOW64 のコマンドプロンプトから、64bit のシステムフォルダを参照する場合は
「C:\Windows\SysNative\」というパスを利用することになります。
(このパスは、64bit プロセスからはアクセスできません)


>>runas 指定の呼び出しは、もっと冒頭に置いた方が良いかな…。
> この手のループをどこに置くか? ってのは、

Do ループにせずとも、If 文で十分だと思います。
まぁ、参考にしたソースがそうなっていた、という事なのでしょうけれども。


> Cで書くWinmainのように、ある種の「お作法」でしょう。

作法というほど堅い話では無いです。その方が単に私の好みという程度の宗教論。
C 言語的なイメージコードで言うと、元のコードは

//------------------------------------------------
  strCommand = odbcconfのコマンドラインを生成;   // ★
  if(引数が0個だった場合) {
   管理者モードで再起動;  // 再起動の識別用に、ダミー引数 "uac"を 追加
   return;
  }
  strCommand のコマンドラインを実行;
//------------------------------------------------

という順序で処理されていますが、それを

//------------------------------------------------
  if(引数が0個だった場合) {
   管理者モードで再起動;  // 再起動の識別用に、ダミー引数 "uac"を 追加
   return;
  }
  strCommand = odbcconfのコマンドラインを生成;   // ★
  strCommand のコマンドラインを実行;
//------------------------------------------------

とした方が良いのでは無いかな、と思ったという程度です。
どうせ再起動してしまうのなら、その前にコマンドラインの準備をすすめたところで無意味なので。


ただ、それによる処理効率などの差は微々たるものです。今回のコードの主目的は
「odbcconf」の実行なのですから、それを目立たせるため、コマンドラインの設定を
あえてコードの先頭に書くようにするのも、方針としては悪くないと思います。


> 殆どが断片的な情報で、全景を見渡せるものがありませんでした。
> 世の大勢の「お作法」があれば、是非ご教示ください。
個々の断片を意図を把握しているなら、良し悪しはあれど、組み合わせは任意だと思いますよ。


作法という類の物では無いですが、余裕があれば、
「管理者として実行されているか」まで調査することもできます。

http://scripting.cocolog-nifty.com/blog/2010/01/post-f725.html
http://yozda.exblog.jp/19733454
http://qiita.com/skkzsh/items/5e03bb7792629927acfa


その上で、管理者実行でなかった場合には、自身を "RunAs" 指定で呼び出し、
管理者モードで呼び直すことになります。 No73570 のコードでは、
管理者実行されていているかの事前判定を省略して、
常に RunAs 指定で呼び直す形になっていますね。


その RunAs 指定の方法はいろいろありますが、VBScript の場合は、
既に利用されているように、ShellExecute メソッドで指定するのが簡単でしょう。

http://www.atmarkit.co.jp/fdotnet/dotnettips/954uacrunas/uacrunas.html
http://msdn.microsoft.com/ja-jp/library/cc781769.aspx

自身を呼び直した時は、それが再起動であることがわかるようにせねばなりませんが、
No73570 で書かれていたコードでは、任意の引数を加えることで識別されているようですね。

引用返信 編集キー/
■73590 / inTopicNo.17)  Re[15]: ODBCデータソース構成ツール
□投稿者/ S.Kos (8回)-(2014/10/14(Tue) 15:44:47)
No73577 (魔界の仮面弁士 さん) に返信

重ね々々のご指導、ありがとうございます、としか言葉がありません。

1.かな漢字変換の、中点「・」を半角とする、という設定を失念してました。ご容赦ください。

2.SQLConfigDataSourceの動作については、後日、改めてレポートします。その節には、ご指導のほど、よろしくお願いします。

3.再帰呼び出しってのは、どうも苦手です。自分の居場所が掴めないような感覚が拭えません。
  このことと環境変数に纏わる「情報」は、決して「蛇足」ではありません。たいへん参考になります。

ここでいったん「解決済み」とさせていただきます。
みなさま、特に魔界の仮面弁士さま、ご指導・ご教示のほど、改めて御礼申しあげます。
ありがとうございました。

解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -