秀インストールについてNo.00288
skohara さん 99/11/09 15:04
 
秀インストールについて質問があります。まずはじめにこのような
優秀なソフトを公開していただき大変感謝しています。

さて、本題ですが、秀インストールを使うにあたり多少変更する必要
があったのでソースからVisual-C++6.0でビルドしてみました。これはWin98上で行い
ました。

しかし出来たEXEファイルが動かないパソコンがあるというので調べてみると、初期
のWin95では動かないようです。起動すらしません。何か対策はあるでしょうか? 
いろいろリンクの設定などをいじってみたのですが、だめでした。

なお、Visual-C++6.0でビルドするにあたりコンパイルエラーが出たので、WinMainの
第一第二引数の型を HINSTANCE に修正しました。そのほかは何も修正していないに
も関わらず初期Win95では動作しないようです。

[ ]
RE:00288 秀インストールについてNo.00289
える さん 99/11/10 00:42
 
秀インストールってソース付きなんですね, 知らなかった.

> しかし出来たEXEファイルが動かないパソコンがあるというので調べてみると、初
>期のWin95では動かないようです。起動すらしません。何か対策はあるでしょうか?
> いろいろリンクの設定などをいじってみたのですが、だめでした。

たぶん聞かれること、

「アーカイブ付属の hminst.exe でも動かないですか ?」

と、ついでにアーカイブ付属の hminst.exe を互換性チェッカにかけてみました。

hminst.exe (109 API) 互換性に問題がある API があります.

GetACP, GetCPInfo, GetOEMCP, TerminateProcess, SetForegroundWindow

これらは Win32s でサポートされていません。

FreeEnvironmentStringsW, GetEnvironmentStringsW, GetStringTypeW, LCMapString
W, MoveFileExA

これらは Win95 でサポートされていません。

なんか変な API がレポートされてるのは Win2K で検出したせいかもしれませんが、
とりあえず MoveFileEx が原因ではないでしょうか。
起動時のエラーって「序数 xx が KERNEL32.DLL からみつかりません」か「欠陥エク
スポート xx が KERNEL32.DLL からみつかりません」ではないですか ?

MoveFileEx は Win95 には存在しない API だと思います。
Win95 OSR2 では存在するらしく、Visual C/C++ の Ver.4 か Ver.5 のヘルプでは
「Win95 で使える, 一部のオプションは使えない」という表示だったと思います。
最新のもの (http://msdn.microsoft.com/library/ とか) では Win95 は unsupport
ed になっています。

これに該当するならば、Visual C/C++ 6.x を利用されているということですので、

line.23 の次あたりに
BOOL fWinNT;

を足して、

line.1110 fWin95 = LOBYTE(GetVersion()) >= 4;



OSVERSIONINFO ofi;
ofi.dwOSVersionInfoSize = sizeof(ofi);
GetVersionEx(&ofi);
fWin95 = (dwMajorVersion >= 4);
fWinNT = (ofi.dwPlatformId == VER_PLATFORM_WIN32_NT);

とでもして、

line.1033 if( MoveFileEx( pszFile, NULL, MOVEFILE_DELAY_UNTIL_REBOOT ) ) {



if (fWin95 && fWinNT && MoveFileEx( pszFile, NULL, MOVEFILE_DELAY_UNTIL_REBO
OT ))) {

として、あとは遅延ローディングでコンパイルすれば OK かな。
遅延ローディングは /DELAY または /DELAYLOAD:KERNEL32.DLL かな ?

# Delphi つかいなので、MSDN のヘルプの範囲以上には詳しくわかりません(汗


[ ]
RE:00289 秀インストールについてNo.00290
skohara さん 99/11/10 01:07
 
えるさん

>「アーカイブ付属の hminst.exe でも動かないですか ?」

付属のexeですね。私がダウンロードしたものでは HideInst.exe という名前です。

これはちゃんと動作します。ですからソースではなくリンクの設定かな? と思った
次第です。

>起動時のエラーって「序数 xx が KERNEL32.DLL からみつかりません」か「欠陥エ
>クスポート xx が KERNEL32.DLL からみつかりません」ではないですか ?

いえ、何もメッセージは出ないのです・・。
一瞬砂時計が見えますが、それでおしまいです。

とりあえず、Visual-C++5.0を別のパソコンにインストールしてそれでコンパイルし
たところうまくいきました。しかし、Visual-C++6.0がメイン環境なので、なんとか
したいところです。

[ ]
RE:00290 秀インストールについてNo.00291
秀まるお さん 99/11/10 12:26
 
 VC++6.0でコンパイルすると、一部コンパイルエラーが出るようですが、そこは対
処されたのですね。たしか、HANDLEとなっている所をHINSTANCEにしないといけない
とか、そういう感じの修正だったと思いますけど。

 それで、本題の、一部のWindows95で動作しない件ですが、えるさんご指摘の
MoveFileExですが、これはWindows95にたしかに存在するはずのAPIです。

 Windows95でサポートされてないのは、この関数に渡すパラメータの

    MOVEFILE_DELAY_UNTIL_REBOOT

 だそうです。(VC++5.0によると)

 これは秀インストールでは使ってないし、使っていたとしても、秀インストールが
起動しない症状は起きないと思います。

 他に思い当たる所といえば、MSVCRT40.DLLかなぁと思います。コンパイルオプショ
ンで、「使用するランタイムライブラリ」の所を「マルチスレッド(DLL)」にして
しまうと、MSVCRT40.DLLが呼ばれてしまう作りになるはずなんですが、このMSVCRT40.
DLLは、初期のWindows95には入っていません。

 それで動かないんじゃないかと思いますけど、どうでしょ?

 この場合は、使用するランタイムライブラリを「シングルスレッド」にすれば解決
すると思います。


[ ]
RE:00291 秀インストールについてNo.00292
秀まるお さん 99/11/10 12:34
 
 がーん、失礼しました。MOVEFILE_DELAY_UNTIL_REBOOT は、確かに使っていました。

 でも、その辺の処理(DeleteFileDelay関数)は、秀丸のインストーラーから取っ
てきた実績のある処理で、そもそもはKnowledge Baseとかいう所に書いてあった処理
なので、大丈夫なはずです。

 と言うわけで、他はよく分からないですが、とにかく動かない時のメッセージ内容
(XXXX.DLLが無いとか)を見れば、どのAPIかがある程度判明すると思います。


[ ]
RE:00292 秀インストールについてNo.00293
skohara さん 99/11/10 15:34
 
コメントありがとうございます。

まず、MoveFileExですが、これをコメントアウトしても動かないので、これではない
と思います。

また、ランタイムライブラリはシングルスレッドです。

> と言うわけで、他はよく分からないですが、とにかく動かない時のメッセージ内容
>(XXXX.DLLが無いとか)を見れば、どのAPIかがある程度判明すると思います。

メッセージも出ないのです。ただ、一瞬砂時計が出るだけです。

どこまでプログラムが進んでいるかを調べてみたところ、WinMainの一番最後まで進
んでいました。つまり、PropertySheetで画面が表示されていないようです。

VC5でコンパイルしたものはうまくいくのに、なぜVC6ではだめなのか不思議です。

[ ]
RE:00293 秀インストールについてNo.00295
秀まるお さん 99/11/11 11:01
 
> つまり、PropertySheetで画面が表示されていないようです。

 んでは、たぶんPropertySheetでエラーが返っているはずなので、

    PropertySheet( &psh );

 の所を、

    if( PropertySheet( &psh ) < 0 ) {
        DWORD dwError = GetLastError();
        char    sz[100];
        wsprintf( sz, "PropertySheet error code = %u", dwError );
        MessageBox( NULL, sz, NULL, MB_OK );
    }

 にして動かしてみれば、何か分かるんじゃないかと思います。


[ ]
RE:00295 秀インストールについてNo.00297
skohara さん 99/11/11 11:37
 
> んでは、たぶんPropertySheetでエラーが返っているはずなので、

確かにそうでした。エラーコードは120です。
で、FormatMessage でメッセージを出してみたところ、「このファンクションはWin3
2モードでのみ有効です」となっていました。

うーむ、ちゃんとWindows95で動かしているのですけどね・・。
もちろん、プロジェクトの構成はWin32 Releaseです。

これを手がかりにさらに調べてみます。

[ ]
RE:00297 秀インストールについてNo.00322
skohara さん 99/11/29 02:18
 
秀インストールが古いWin95では動かない件です。
なんとか解決しました。
解決策は、以下の文です。

#define _WIN32_IE 0x0200

いろいろ調べていたらこのページを検索エンジンで見つけまして、
解決策が分かりました。

http://isw.huie.hokudai.ac.jp/~tokai/COMP/vcchips.html#9

どうも、VC6ではIE4以降のcomctl32.dllがデフォールトになっているようです。以上、
ご報告まで。



[ ]