開発環境は
VB6.0
WindowsXP SP2
です。
Exeプログラムから自前のCOMを呼んでファイル出力する処理を作っています。
困っているのは、COMのメソッドを呼び出すタイミングでエラーが発生します。
[Err.Number]-2147417848
[Err.Description]
オートメーション エラーです。
起動されたオブジェクトはクライアントから切断されました。
デバッグモード(ExeプロジェクトにCOMプロジェクトを追加して実行)では
問題のメソッドを実行しても上記エラーは発生しません。
DLLにコンパイル、レジストして実行するとエラーが発生します。
COM側のメソッド内部の一番最初にログを吐き出すような処理を入れてみましたが、ログが吐き出されていないので、呼出時の記述ミスか何かが影響しているのではと、現時点では考えています。
下記サンプルのコードですが、どなたか原因がお分かりになる方がいらっしゃいますでしょうか。
【COM側】
Public Type typGeneratedXmlInfo
strXmlFileName As String 'XMLファイル名
strErrModule As String 'エラーモジュール
lngErrNumber As Long 'エラー番号
strErrDescription As String 'エラー内容
End Type
Dim mtyp_clsXmlInfo() As typGeneratedXmlInfo
Public Function M_XmlGenerate(ByVal para1 As String, _
ByVal para2 As String, _
ByVal para3 As String, _
ByVal para4 As String, _
ByVal para5 As String, _
ByRef ptyp_clsXmlInfo() As typGeneratedXmlInfo) As Integer
(処理を記述)
End Function
【EXE側】
'COMコンポーネントの宣言
Set objComXml = CreateObject("AAA.clsBBB")
Dim typXmlFileInfo() As typGeneratedXmlInfo
'DB文字列セット
objComXml.P_DBStr = "XXXXX"
'XML生成メソッド呼出
intRet = objComXml.M_XmlGenerate(p1,p2,p3,p4,p5,typXmlFileInfo)
(↑このメソッドで上記エラーが発生)
COMだけをデバックしても
エラーはでませんか?
あんさん、ありがとうございます。
お恥ずかしながら、COMの開発の際のデバッグは
EXEから呼び出す方法しか知らないのですが、
COM単体でデバッグすることは可能なのですか?
もし可能であればその方法を教えて欲しいのですが。。
COMのプロジェクトを
読み込んで実行です。
呼び出されるとデバック可能です。
スタートアップの設定を「(なし)」にしているので
実行しても無反応です。
こちらのやり方が何か間違っているのでしょうか?
デバックの仕方から勉強しなおしてください
おかげで別のデバッグの方法が分かりました。
ありがとうございます。
で、本題に戻りますがエラーは出ませんでした。
何かお分かりになりますか??
>COM側のメソッド内部の一番最初にログを吐き出すような処理を入れてみましたが、ログが吐き出されていないので、呼出時の記述ミスか何かが影響しているのではと、現時点では考えています。
ログはでましたか?
ログは出ます。
最初にデバッグしたときと状況は同じです。
上記について、
> Set objComXml = CreateObject("AAA.clsBBB")
の部分を
Dim objComXml As New AAA.clsBBB
もしくは
Dim objComXml As AAA.clsBBB
Set objComXml = New AAA.clsBBB
と修正したら実行できました。
CreateObjectで生成すると駄目なのは
COM側のプロパティなどの問題でしょうか?
どなたか助けてください!
> CreateObjectで生成すると駄目なのは
すみません、正しくはアーリーバインドだとOKで、
レイトバインドだとNGのようです。
アーリーバインドの宣言でCreateObjectはOKでした。。
大事なことを言い忘れていましたが、
Dim objComXml As Object
Set objComXml = CreateObject("AAA.clsBBB")
の形で実現させたいのです。
クラスの文字列の部分を動的に呼び出したいのです。
どうか、どなたかご教授お願いします!
自己解決です。
ユーザー定義型を使っていたところをVariant型に修正して
実行してみたところ、正常にスルーしました。
どうやらレイトバインドをする場合は、
引数(戻り値も?)は通常のデータ型だけが使用可能のようです。
(私の理解が正しければ・・・)
下記、修正版です。
【COM側】
Public Type typGeneratedXmlInfo
strXmlFileName As String 'XMLファイル名
strErrModule As String 'エラーモジュール
lngErrNumber As Long 'エラー番号
strErrDescription As String 'エラー内容
End Type
Dim mtyp_clsXmlInfo() As typGeneratedXmlInfo
Public Function M_XmlGenerate(ByVal para1 As String, _
ByVal para2 As String, _
ByVal para3 As String, _
ByVal para4 As String, _
ByVal para5 As String, _
ByRef ptyp_clsXmlInfo As Variant) As Integer
(処理を記述)
End Function
【EXE側】
'COMコンポーネントの宣言
Set objComXml = CreateObject("AAA.clsBBB")
Dim typXmlFileInfo As Variant
'DB文字列セット
objComXml.P_DBStr = "XXXXX"
'XML生成メソッド呼出
intRet = objComXml.M_XmlGenerate(p1,p2,p3,p4,p5,typXmlFileInfo)
コメント頂いた あん さん、ありがとうございました。
ツイート | ![]() |