- ベストアンサー
VB6.0を使用しています
VB6.0を使用しています VC6.0でdefファイルで宣言してDLLを作成し VBのEXEよりDLLをCALLしています。 VBではDLLの関数をDeclareで宣言しています。 問題なのは ちょっと前まで問題なく動いたDLLですが 新規にDLL関数を追加したら EXEではちゃんと呼び出して処理を行なってくれておりますが VBのデバッグ起動で呼び出すと、その新規のDLLの関数がありませんと メッセージを通知して止まってしまいます、 EXEでは動くのにデバッグ起動ではだめなんでしょうか??不思議です もし、ご存知の方がいらっしゃいましたら教えてください。
- PaPaiYa09
- お礼率62% (5/8)
- Visual Basic
- 回答数4
- ありがとう数3
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
System32に無いので、やはりカレントを探しています。 EXEになっている方は同じフォルダ内にあるDLLを使って いると思われますが、デバッグ中のカレントは規定では VB自体が起動した所なので、探す場所が違っていると 考えられます。試しに、CurDirをメッセージボックスで 表示するコードを入れてみるとハッキリします。 そこで、DLLの関数を使用する前にカレントを自分の プロジェクトのフォルダ(ここには最新DLLを置く)に 移動しておきます。これでDLLを探す場所を変更できます。 本当はDLLの定義をClassモジュールで定義し、ここを 通して間接的に呼び出す方が、より好ましいのです。 標準モジュールですと、DLLはプロセス空間にロードされる ため、一度でも実行(ロード)されるとリフレッシュでき ませんが、Classモジュールで定義すると、インスタンスを 作り直す(一度、Nothingをセットしてから再度、Newを行う) ことで、DLLをリフレシュできます。特にWinSockのように、 障害で内部データが壊れると、リフレッシュしない限り復旧 しない作り(内部データを保持する)のDLLでは尚更です。
その他の回答 (3)
- Hayashi_Trek
- ベストアンサー率44% (366/818)
DLLのパスをFullPath指定していないためです。 EXEを直接起動した場合は、カレントフォルダはEXEの有るフォルダになります。 しかし、VBのデバッグ起動した場合は、カレントフォルダはVB6.0のインストールフォルダになります。 System32フォルダにDLLをコピーするか、 DLLのパスをAppPathを使ってFullPath指定にする必要が有ります。
- tsukasa-12r
- ベストアンサー率65% (358/549)
確か、標準の状態だとデバッグビルドのEXEとリリースビルドのEXEは別々のフォルダに作成されるんだったと思うのですが、デバッグビルドのEXEがあるフォルダに古いDLLが残っているということはないでしょうか? 新規の関数以外はデバッグ実行でも呼び出せるのでしたら、一度、デバッグ実行でも呼び出せる関数にメッセージボックスなどの処理を入れてみて、本当に新しいDLLを読み込んでいるのか確認してみてはどうでしょう。
- nda23
- ベストアンサー率54% (777/1415)
DLLのパスが違うためじゃないですか? Libの指定はどうしてますか? 絶対パス指定でない場合はSystem32を探し、 そこに無いとカレントを探したと思います。 実環境の方だけ新DLLを入れ、テスト環境は 以前のまま、というようなことは?
補足
>DLLのパスが違うためじゃないですか? パスは同じEXEの直下です >実環境の方だけ新DLLを入れ、テスト環境は >以前のまま、というようなことは? 実環境もテスト環境も同じフォルダでEXEの直下 また、System32に同じ名前のDLLもしくはLibがあるかどうか確認しましたが なかったです。 ん~ 悩み中です・・・
関連するQ&A
- VCやVBで作成したDLLがどのEXEから起動されているか知りたい。
VBやVCで作成したDLLがそれぞれあります。 それぞれは複数のEXEから起動されます。 DLLの中でどのEXEから起動されたか知りたいんですが なにか方法はありませんか? 起動している関数などにパラメータを追加できない事情がありまして・・・ よろしくお願いします。
- ベストアンサー
- C・C++・C#
- dllを使用しVB側に文字列を返す2
No.280310の質問の続きになってしまいますが 「VCで作ったdllを使用し VBに文字列を返すことはできますか」 でVCで作ったdllをVBを呼び出す事ができるようになりました。 Declare宣言で疑問に思ったのですが Declare Function TxtCnt Lib "hoge.dll" (ByVal a As String) As Long aはなぜ値渡しなのでしょうか? 変数が書き換えられて戻ってくるので、byrefで指定していました。 それが問題が起こしていた原因一つでした。 ちなみにint型の数値をポインタで渡した場合はbyrefでうまくいきます。 ご教授願います。
- ベストアンサー
- Visual Basic
- VBがデバッグ時落ちてしまう
VC6.0でDLLを作成し、VB6.0で呼び出すプログラムを作成しています。 DLLの内容はWindowハンドルを引数にしてそのハンドルを持つWindow上にListboxを作成するというようなものです。(もともとC言語用のDLLだったものをVBで使いまわしています) このプログラムをデバッグ実行し、デバッガ上で停止[実行->終了]とすると、VB6.exeがアプリケーションエラーで落ちてしまいます。(DLLの関数を呼ばない限り大丈夫です) デバッグ実行でも普通に終了(アプリケーションでの終了)であれば正常に終了してくれます。 このままですと、実行時エラーで止まる度にVB6.exeが落ちてしまい非常に不便です。 このような現象で困った方いませんか? 解決策がありましたら教えてください。
- ベストアンサー
- Visual Basic
- VB.netの配列とVB6の配列の違い
VB6で画面を作成し、演算処理を行うDLLをVC6で作成しています。 下記のコードでVB6でSingle型の2次元配列を宣言しま、VCのDLLでエクスポートしている関数に渡 します。 VC6DLL側のコード---------- EXPORT void __stdcall TESTFUNC (float *pfData,long nSize{ } VB側のコード---------- 宣言 Declare Function TESTFUNC Lib "TEST.dll" (ByRef pfData As Single, ByVal nSize As Long) As Long 配列宣言 Public sngDat(999,1) as single 呼び出し TESTFUNC sngDat(0,0),1000 このように呼び出した場合、VC6のTESTFUNC にブレークポイントを設定し、停止するとpfDataの ポインタをインクリメントした場合、sngDat(0,0),sngDat(1,0),sngDat(2,0)と、1次元目の添え字を インクリメントした状態になるように、メモリに格納されています。 この動作を前提として、VB.net側でも同じように呼び出してみました。 VB.net側のコード---------- 宣言 Declare Function TESTFUNC Lib "TEST.dll" (ByRef pfData As Single, ByVal nSize As Integer) As Integer 配列宣言 Public sngDat(999,1) as single 呼び出し TESTFUNC(sngDat(0,0),1000) VC側は全く同じコードを利用するとします。 同じように、VC6のTESTFUNC にブレークポイントを設定し、停止するとpfDataの ポインタをインクリメントした場合、sngDat(0,0),sngDat(0,1),sngDat(1,0)と,sngDat(1,1)、と1次元目の添え字を インクリメントせず、2次元目の添え字をインクリメントした状態になるように、メモリに格納されています。 VB6→VC6のDLLの場合の配列渡しと、VB.net→VC6のDLLの場合の配列渡しで違いがあるのは 何故でしょうか?また、VB.net側の配列渡しの仕様を、VB6側の仕様に合わせる方法は無いのでしょうか? よろしくお願いいたします。
- ベストアンサー
- Visual Basic
- Cで作成したDLLをVBで呼出
Cで作成したDLLの関数をVB6.0から呼び出す事ができず、悩んでおります。 ご教授お願いします。 どの様な関数を呼び出そうとしているのかというと、以下の通りです。 <DLL Cで作成(コンパイラVC6)> void WINAPI hoge(BSTR pgname,BSTR fmt,...){ ~処理~ } /* 宣言では頭にDLLExport*/ <呼出側 VB6.0で作成> '宣言 Public Declare Function hoge Lib "hoge" _ (ByRef pgname as String , _ ByRef fmt as String , _ ParamArray args()) '呼出 call hoge("foo","baa","array1",2) この様なコードを書いております。 C側、VB側ともに固定数の引数にしてみたところ、 通ったので「ParamArray args()」の定義が違うのではないか・・・?と思っているのですが、 どの様に宣言したらよい物なのでしょうか? もしくは、そもそも全然違う箇所を間違っているのでしょうか? 宜しくお願いします。 ※ 説明の足りない箇所があれば、仰ってください。
- ベストアンサー
- Visual Basic
- VB6から参照可能なDLLの作成
VB6から参照可能なDLLの作成を参考書をみながらしましたが、上手くいかない為質問させていただきます。 開発環境VC++ 2005 C++ CTEST.dll #include <windows.h> __declspec (dllexport) int __stdcall test(int i) { i = i + 5; return i; } .defファイル LIBRARY "test" DESCRIPTION EXPORTS A 以上でDLLを作成し、VB6側で Private Declare test Lib "CTEST.dll" (ByVal i as integer) で宣言しても「エラー53 ファイルがみつかりません」と表示されます。「参照の追加」から参照しようとしても「このファイルは参照できません。」をエラーがでてしまいます。 直すべき点はどの部分なのでしょうか? ご教示ねがいます。
- ベストアンサー
- C・C++・C#
- VCで作成したDLLの使用
VCで作成したDLLの使用 VC6.0で作成されたDLLファイルを使いたいのですが _stdcallで記述されたものではなく DllMainで記述されたものなのですが、 VBから呼び出す事は可能でしょうか? 普通にdeclare functionで呼び出そうとすると、 「エントリfnchogeがDLLファイル hoge.dll内に関数が見つかりません。」 とエラーがでるだけでした。 VB6.0SP3 Windows2000
- ベストアンサー
- Visual Basic
- defファイルの序数って何でしょう?
現在、VC++でDLLを作成し、そのDLLを使ってVBから関数を呼び出しているのですが、DLL開発についてわからないことがあります。 色々調べた結果、DLL作成時にdefファイルが必要である。 ということまではわかっているのですが、 defファイルの記述として行う「序数」がいまいちわかりません。 調べたものによると 「DLLのファイルサイズが小さくなる」 「新しく関数を追加するときは大きな数値を与える」 などが書かれてありました。 いったい序数は何のために(どんなときに)使うものなのでしょうか? よろしくお願いします。
- ベストアンサー
- C・C++・C#
- VS2008でVBとC++を一つのプロジェクトにすることができますか?
VB6.0からの移行組です。現在VB6.0をメインにしてVC++6.0で作ったdllをVBで呼んでいます。VBでデバッグ中にC++で作ったdll内にバグがあった場合にどこにバグがあるかわからず不便です。 VS2008ではVBとVC++を一つのプロジェクトにまとめる事ができますか? そうすればデバッグ中にVBとVC++のコードを一連の流れで動かしてやれば、どこがおかしいのか分かりやすくて便利なんですが。 (C++がコンパイル型だから無理かな・・・) 素人な質問ですみませんがよろしくお願いします。
- ベストアンサー
- Visual Basic
- 16ビットDLLから32ビットDLLをコールする方法
現在VC++で「16ビットDLLから32ビットDLLをコール」をしようと思って 調べていましたが、このご質問に頼るしか方法がなく、困っています。 状況 VB4.0(16bit)・・・16bit版でEXEを作成 VC++1.51・・・・・16bitDLLを作成 VC++4.0/6.0・・・・32bitDLLを作成 VB4.0(16bit)のEXEから、16bit版のDLLをコールし処理を行いたいの ですが、16bit版DLLで扱えないVC++の関数(プロセス関数:spawn??()) を利用しなければならず、16bit版DLLの機能を32bit版DLLで作成し、 16bit版DLLから32bit版DLLを呼び出そうと思っております。 誰か助けて! 是非、皆様のお知恵を拝借致したく思います。
- ベストアンサー
- C・C++・C#
お礼
確かにVBがある場所(ProglamFilesのなかかな)に DLLがある可能性たしかにがあります。 >CurDirをメッセージボックスで >表示するコードを入れてみる 上記の対応で確認出来そうです。 実際の確認は客先に行かないと確認出来ないので 別途、行った際に確認します。 ありがとうございました 解決として処理します。