VB6でプログラムをつくりました(OS:WINDOWS98)が、EXEファイルを他のPC(OS:WINDOWS2000/WINDOWS95等)で実行させるのですが、うまくうごきません。API関数を使用しているのでこのためかと思いますが、どのように対処したらよいかわかりません。
"SLEEP"
"RegCloseKey/RegOpenKeyEx"
"RegQueryValueExstr"
"Keybd_event"
を使用しています。
他のPCにはソフトの干渉からVBをインストールすることはできません。
DLLをシステムに入れることなら問題ないのですが、どなたか教えていただけませんか?

このQ&Aに関連する最新のQ&A

A 回答 (4件)

他のPCには、VB6 の環境が全く入っていないということですよね。


そうであれば、EXE ファイルだけを単体で持っていっても、動きません。ランタイムライブラリが必要です。

ランタイムライブラリは、パッケージになったものがネットからでもDLできると思いますが、それよりも、No.1 の方がおっしゃるように、セットアップパッケージを作成した方がベターです。

セットアップパッケージは、VB6 の「ディストリビューション ウィザード」で簡単に作成できます。
このプログラムを立ち上げて、質問に答えていくだけで、配布用のパッケージを作ることができます。
完成したパッケージには、そのプログラムを動かすのに必要なランタイムライブラリがすべて含まれていますので、全く何もない環境に持っていっても、正しくインストールすることができます。

これを実際にやってみて、わからないことがあれば、補足して下さい。
    • good
    • 0
この回答へのお礼

わかりやすくどうもありがとうございました。

お礼日時:2001/12/21 17:25

Win98で動いてWinNT/Win2000で動かない場合は「APIのせい?」っていう疑問が発生しますが、Win95でも動かないとなると、APIの理由という考え以前に「VBのDLLが入っていないため」と理由を考えるべきです。



VBで作成したEXEにはフォームなども含まれてませんか?フォームを使用したならば、VBのDLLが必要となります。
下記のアドバイス通り、EXEを単にコピーして実行するのではなく、セットアップを作成して、EXEに付随するDLL郡をインストールする必要があります。

APIの使用で注意しなければならないのは、レジストリエントリ名の長さの最大長さが、95系であれば255文字までであることぐらいなのですが、98で動いているのであれば問題なさそうです。
各APIは95系/NT系のどちらでも使用可能なAPIですので、API関数というわけではないと思うのですが。。。
    • good
    • 0
この回答へのお礼

わかりました。
セットアップをつくってみます。
どうもありがとうございました。

お礼日時:2001/12/21 17:27

こんにちは、honiyonです。



 具体的に、「うまくうごかない」とはどのような状態でしょうか?
 その症状により、原因は複数考えられます。
 「起動出来ない」のであれば、VB製ソフトに必要なDLLがインストールされていない可能性があり、それをてっとり早く解決するには zerosixさんの方法がよいと思います。
 もし、起動はするが不具合が生じる、というのであればそのプログラムにバグがある可能性も考えられます。 Win98で正常動作しても、OSを変えると今まで発見できなかったバグに遭遇する、ということはよくあるものです。

 参考になれば幸いです(..
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2001/12/21 17:26

>他のPCにはソフトの干渉からVBをインストールすることはできません。


開発環境をインストールすることはできないということでしょうか?

セットアップ用のパッケージを作成して、そのパッケージから
インストールすればいいと思います。
    • good
    • 0
この回答へのお礼

どうもありがとうございます。
素人なので理解に苦しいです。
すみません。

お礼日時:2001/12/21 17:24

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q【keybd_event】について

VB6,Windows XPにて動作するAPを作成しています。

現在【半角カナ入力】を行うAPを作っています。
フォーム上に、カナが表示されたイメージコントロールとテキストボックスがあり、
イメージコントロールをクリックされた時に、対応するカナをテキストボックスに表示したいのですが、【SendKeys】は使用したくありません。
調べた結果、【keybd_event】を使用すれば実現出来そうだと思ったのですが、keybd_eventで半角カナを表示するにはどうすればいいのでしょうか?
数字の表示は問題なく出来ています。

ご存知の方教えて頂けると幸いです。
よろしくお願いします。

Aベストアンサー

普通に文字列操作するのもなんら変わりはないですが。

Text1 = Left(Text1, Text1.SelStart) & "カ" & Mid(Text1, Text1.SelStart + Text1.SelLength + 1)


>その動きを実現するには、文字列連結での制御より、
>SendKeysやkeybd_eventを使用する方が簡単だと思ったからなのです。

入力対象のコントロールにフォーカスを当てたりIMEをいじったりするほうが、よっぽど動きがあいまいで面倒かと思いますけど。

QAPI Sleep関数について

Sleep()で指定できる最大値はいくつになりますか?

Aベストアンサー

ミリ秒(1/1000)で指定し、引数はas Longだから、長整数型で2,147,483,647(2^31)ミリ秒と、定義どおり考えて良いのではないでしょうか。
だだこのAPIの作用の性格から限度が自ずとあるでしょう。
大きい数字を与えてしまったばあい、Ctrl+Pause(Break)では、止めれないので注意との事です。

QVB.NETとVB6.0でAPIを使う場合、書き方は違いますか?

VB.NETで使うAPIというものを勉強してみたいと思って
本を探しているのですが、.NET用の本が少ないようです。

APIを使う部分のコードの書き方は.NETと6.0では大きく違うでしょうか?

Aベストアンサー

BLUEPIXYさんが言われているように、使用するための引き込みの宣言が微妙に異なります。

大きく違う部分としては、メモリを意識する方法だと思います。
何かと
Imports System.Runtime.InteropServices.Marshal
クラスを多用することになります。


例えばVB6時代に
・VarPtrを使用しなければならない場合
・APIの引数に構造体を利用し、構造体内部のメンバに配列が存在する場合
・APIの引数に構造体を利用し、構造体内部のメンバに固定長の文字列型が存在する場合
・APIの引数に構造体を利用し、構造体内部のメンバのIN/OUTなどの属性を細かく設定しなければならない場合
・APIの引数に、構造体の領域サイズ長を渡す必要がある場合
・API関数実行後、取得したポインタから、特定の型にキャストする場合
などなど、、、

http://okwave.jp/kotaeru.php3?q=2092957
に、Marshalクラスを多用しているサンプルを書いてますので、よろしければどうぞです。



ちなみに私の場合は、.NETの書籍は一冊も購入しておりません。
VB6時代に購入した、APIの書籍
「Visual Basic Tips 1000」
http://bookweb.kinokuniya.co.jp/guest/cgi-bin/wshosea.cgi?W-ISBN=4883371980
を愛用しております。
ガリバーさんが出している書籍で、今は亡き[vbvbvb.com]のAPIサンプルが出ております。
HTMLで一覧が出ているので、秀丸などでGREPして、使用したい目的のAPIが素早く検索できます。

さらに
http://www.microsoft.com/japan/msdn/net/general/win32map.asp
で、本当にAPIを使用しなければならないかを調べた後、どうしてもAPIならば、サンプルソースをEXCELのVBAなどに張って、変換を行っております。


APIで使用するDLLは「VB6用」でもないし「.NET用」でもないですよね。
わたしは最近本屋さんに行っておりませんので、.NET用で多くのサンプルがある本が出版されているのか知らないのですが、、、
「.NET用の本」として固執せずに、多くのサンプルが出ている本を求めた方が、何かと便利だと思います。
「どのようなAPI関数が存在するか」「API関数で可能なこと」
が見えます。


VB6用の本を購入した場合、どうしても変換がわからない場合は、ここのような掲示板や、メーリングリストに投稿してはいかがでしょうか?
変換は「慣れ」です。繰り返し行うことで、自然と身につきます。変換のパターンは、経験上、それほど多いとも思いません。

そうすることにより、「このAPIは、、、」という技術ではなく「このタイプのAPIは、、、」という、参考文献の存在しないAPI関数にも強くなれると思います。
機会があれば、自分でCで呼び出される側のDLLを作成してみるのも、スキルアップだと思いますよー
http://okwave.jp/kotaeru.php3?q=235547

BLUEPIXYさんが言われているように、使用するための引き込みの宣言が微妙に異なります。

大きく違う部分としては、メモリを意識する方法だと思います。
何かと
Imports System.Runtime.InteropServices.Marshal
クラスを多用することになります。


例えばVB6時代に
・VarPtrを使用しなければならない場合
・APIの引数に構造体を利用し、構造体内部のメンバに配列が存在する場合
・APIの引数に構造体を利用し、構造体内部のメンバに固定長の文字列型が存在する場合
・APIの引数に構造体を利用し、構...続きを読む

QVB.NET 2008 Eventステートメント

VB.NET 2008
以下の実装で実行したところ、GC強制実行後のメモリ状態に疑問を持ち質問しました。
Eventを所持したクラスの生成、削除を繰り返し、GCを強制実行したところ、
16バイトごと増加していきます。
Class1で定義したm_eventをイベントから別のタイプ、例えばIntegerやString型に変更して、
同様に実行したところ、メモリの増加は見受けられません。
なぜでしょうか?
またこの現象はメモリリークといえるのでしょうか?

Public Class Class1
Public Sub New()
End Sub
Private Event m_event()
End Class

Sub Main()
GC.Collect()
Debug.Print("####")
Debug.Print(GC.GetTotalMemory(False))
Dim cls As Class1
For i As Integer = 0 To 1000
cls = New Class1
cls = Nothing
If i = 0 Then
GC.Collect()
Debug.Print(GC.GetTotalMemory(False))

End If
Next
GC.Collect()
Debug.Print(GC.GetTotalMemory(False))
Debug.Print("@@@@")
End Sub

VB.NET 2008
以下の実装で実行したところ、GC強制実行後のメモリ状態に疑問を持ち質問しました。
Eventを所持したクラスの生成、削除を繰り返し、GCを強制実行したところ、
16バイトごと増加していきます。
Class1で定義したm_eventをイベントから別のタイプ、例えばIntegerやString型に変更して、
同様に実行したところ、メモリの増加は見受けられません。
なぜでしょうか?
またこの現象はメモリリークといえるのでしょうか?

Public Class Class1
Public Sub New()
End Sub
Private Event m_eve...続きを読む

Aベストアンサー

クラスに未使用のイベントが多数含まれると、メモリが不必要に消費するということですから、リークとまではいえないのでないでしょうか。(今回の場合は未使用のイベントひとつのクラスが多数でしょうが)
ただ、イベントに紐づけたハンドラを解除しないで放っておいたりすると発生するのはリークになるでしょうね。

参考
http://msdn.microsoft.com/ja-jp/library/yt1k2w4e(v=vs.90).aspx

QVBのEVENT発生とCONTROLの有効範囲

visual basicのeventとcontrolについての質問です。
 初心者で苦労しています。以下のようなcodeingをしましたが上手く行きません。宜しくお願いします。

1.下記のcall updatefileによりupdatefile内でcombobox内のdataを設定します。これは次のdialogで
  設定どおりに出ています。しかし元のsub startdialog1に帰ってdialogを表示してみるとcombobox
  内は空となっています。  subroutineが変わるとformの controlは消えるのでしょうか。
  もしそうならどの様にすれば良いのでしょうか。
  (pushdata変数等をpublicとして再度comboに入れることもやりましたがNG)

2.STARTDIALOG1の初めに RADIO BUTTONの変更のCODEが有りますが、此処でEVENTが
   発生しUPDATEFILEに行きます。
   DIALOGを出すまでは初期値を設定しDIALOG上でCLICK等して変更をするCODEなので
   不具合です。 (ほかにもいろいろ同じCODEが入っていますので)
   CODE上の設定変更はEVENTが発生しないように、DIALOGからの変更はEVENT発生としたい
   のですがどの様にしたら良いでしょうか。(普通そうなので何か勘違いしてるかも)
  INTERNETで見るとAddHandler,AddressOf,REmoveHandlerなどが記載されていますが、
   書き方と何処に書くのか判りません。(本当に必要かも?)
   よろしくお願いします。
   (以下のcodeは読みやすいように簡略化しています、code errorは大目に見て下さい。


---------------------Form1.vbに記載---------------------------------------   
Sub STARTDIALOG1()    '此処から処理が始まる
with cform2 as Fform2
.Radio_btn1.Checked = True  ’ここへくるとbuttonのeventが発生,routineにいき,updatefileへいく
Call UpdatePfile(1) 'ここはcomboboxの初期値を設定する(UPDATEPFILEを使う)
.ShowDialog()     ’UpdatateFileでは入っていたがCOMOBOXの中は空になっている
              この後comboboxのdataの選択などをdialogue上で設定値を変更する。
end with
end sub

-----------------------form1.vbに記載----------------------------------
sub UpdatePfile(ByVal cntlNO)
'PushDataはこの前にREADして設定している、keがそのDATAの個数

For k = 1 To ke
cForm2.Combo_P.Items.Add(pushdata(k)) ’COMBOBOX Comb_Pに一覧として入れる
Next k

cForm2.ShowDialog()   'ここではCOMBOBOXにPUSHDATAが入ったLISTがでる

end sub
---------------------------------------------------------------------------

DisalogはForm2に作成
   radioボタン Radio_btn1とRadio_btn2,combobox combo_P等をsetしている


'---------------------------Form2.vbに記載------------------------------------
Private Sub push_button(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
Radio_BTN1.CheckedChanged,Radio_BTN2.CheckChanged

Dim cls As Form1
RDBTN = 1
If RDBTN > 0 Then Call cls.UpdatePfile(RDBTN)
end Sub

visual basicのeventとcontrolについての質問です。
 初心者で苦労しています。以下のようなcodeingをしましたが上手く行きません。宜しくお願いします。

1.下記のcall updatefileによりupdatefile内でcombobox内のdataを設定します。これは次のdialogで
  設定どおりに出ています。しかし元のsub startdialog1に帰ってdialogを表示してみるとcombobox
  内は空となっています。  subroutineが変わるとformの controlは消えるのでしょうか。
  もしそうならどの様にすれば良いのでしょうか。
  (pu...続きを読む

Aベストアンサー

ちょっと確認していませんが
> .Radio_btn1.Checked = True  ’ここへくるとbuttonのeventが発生,

イベントは節制しますが、実際に対応するルーチンが実行されるのは、このSubを抜けた後だったように思います。
デバッガでステップ実行したらどうなってますか?


このカテゴリの人気Q&Aランキング

おすすめ情報