• 締切済み

VB.netでクラスにデータが渡せない

現在、C#で作られたソースをDLL化して、VB.netでプログラムを 作っているのですが、C#側のクラスにVB.netで値を渡し、関数を 動かそうとすると、Nullのエラーが発生してしまいます。 C#のサンプルプログラム通りに、値を渡しているのですが。 ちなみに、Amazon MWSプログラムです。

みんなの回答

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.2

質問に書いてある内容からいえることは「どこか間違えてる」くらいです。

回答No.1

エラーの詳細を書かないとよくわからないですが とりあえず、VB.net側で呼び出す前とC#側のクラスで呼び出された時に変数の内容をロギングしてデバッグしていったらどうですか? 呼び出す前は値が入ってるのか、呼び出された時には入ってるのか、何処でエラーになっているのか?そういう所から始めると特定し易いのでは

関連するQ&A

  • VB.NETでクラスライブラリプロジェクトがでてこない

    VB.NETスタンダードですが、DLLを作りたいのですが、新しいプロジェクトで「クラスライブラリプロジェクト」がでてきません。どうしてでしょうか? また、VB.NETで普通にDLLを作成するには、やはり「クラスライブラリプロジェクト」を開くしかないのでしょうか?

  • VC++6.0からVBで作成したActiveX.DLL内の関数が呼出しできない

    VB6.0で作成したActiveX.DLLをVC++6.0(Win32SDK)側で 呼び出すプログラムを作成中です。 VB側(DLL)では問題なく作成できています。 Classに1つPublic関数を作成しただけです。 (Instancingは5MultiUseにしてあります) しかし、VC++側の呼出しでDLL内の関数が 呼び出せないのです。 LoadLibraryExでDLL自体のハンドルは取得できるのですが GetProcAddressで関数の取得時にNULLが返ってきてしまいます。 今まで試したことは ・VBからの呼出しはOK ・MFCだとOK ・SDKでもuser32.dll呼出しのサンプルは関数も実行できる です。 今からMFCへ以降するのは厳しいのでSDkでの方法を 知りたいです。 VB側が悪いのかもしれませんが、関数1つですし、 いじるところもほとんどないので多分VC++側だと 思っています。 なにか注意点とか確認するところをおしえていただければ 幸いです。 環境 Windows2000 SP3 VB6.0 SP5 VC++6.0 SP5 Win32SDK

  • VB.NETでテンプレート関数・クラス

    VB.NET(.NET2.0ベース)でテンプレートを用いてクラスや関数を定義したいのですが、方法が分かりません。検索してもC#やC++ばかり出てきます。 C#が出てくるのだから、VBでも…と思いましたが、CILに展開される際、型毎に多重宣言でもしているんでしょうか? とりあえず、VB.NETでテンプレートの使い方をご教示頂ければ幸いです。

  • VB6とVB.NETでNullの扱いが違う?

    いつもお世話になっております。 VB6.0で開発していたプログラムをVB.NETに変更することになりました。 そこで、以下の所で困っています。 VB6.0で   If IsNull(T_RYOSYU!cnt) = True Or T_RYOSYU!cnt = 0 Then と書いていた箇所をVB.NETで   If IsDBNull(T_RYOSYU.Fields("cnt").Value) = True Or T_RYOSYU.Fields("cnt").Value = 0 Then と変更しました。 このプログラムでT_RYOSYU.Fields("cnt").ValueがNullのとき、エラーが発生しました。 原因はOrの後で、Nullと0を=で比較していたからなのですが、 VB6.0の場合はNullでもそのようなエラーは発生しませんでした。 OrをOrElseに変更することで、Nullの場合には後ろの式は判定されなくなったので、VB.NET側でも動くようになりました。 VB6.0の場合はNullと0の比較が出来たということでしょうか? それとも、VB6.0の場合はOrの前が真の場合、後ろは判定されないのでしょうか? よろしくお願いします。

  • VB6.0からVB.NETへの移行

    VB6.0から.NETへの移行を行うこととなりましたが、C++で作成したDLL呼び出し方法がわからず悩んでいます。 C++側で作成したDLLは修正が出来ない為、.NET側のみで修正しなければならない状況です。 VB6.0側のプログラムは以下のような感じです。 Public FName() As String Declare Function A Lib "Test.dll" (ByRef field As Variant) As Long ReDim FName(4) As String FName(1) = "1" FName(2) = "22" FName(3) = "333" FName(4) = "4444" Call A(fieldName) C++側は、以下の形で受けているようです。 A(variant *field); SAFEARRAY *psa = *(field->pparray); VB.NET側で以下の様にしてみたのですが、まともに動いてくれません。 Public FName() As String Declare Function A Lib "Test.dll" (ByRef field As Object) As Integer ReDim FName(3) As String FName(0) = "1" FName(1) = "22" FName(2) = "333" FName(3) = "4444" Call A(FName) VB.NETに詳しい方であれば、すごく基本的なことなのではないかと思いますが、よろしくお願いいたします。

  • VC++のDLLをVB6.0からVB.NETへ移行する方法

    はじめて投稿します。 今、現状VB6.0のプログラムで使用しているVC++のDLLを VB.NETで使用できるように、VB.NETのソースの改修をしています。 (開発環境は、VisualStudio.NET 2003) たいていのDLLは、DllImportを行うことで VB.NETから使用できることを確認しました。 /*--(例)------------------------------------------*/ Imports System.Runtime.InteropServices <DllImport("DLLTest.dll")> _ Private Shared Function DLLTestMethod() As Integer End Function /*------------------------------------------------*/ しかし、苦戦しているDLLファイルがあって、 そのソースを見ると、COMで実装されているようで、 コンパイルしたらタイプライブラリファイルが作成されています。 またDLLのレジストリも登録されているようです。 VB6.0でどう使われているか確認したところ、 そのDLLの参照設定をしていて、 "Public obj As New クラス名"でクラス宣言した後、 obj.関数名()で処理を行っています。 VB.NETでいろいろ試行錯誤してみましたが 参照設定はできるものの、その後で手詰まりになっています。 (参照設定しても、灰色になっているクラス名が存在するので 正しく設定できているかも怪しい状態) (1)----------------------------------------------- 参照設定後、オブジェクトブラウザから見えるクラスをNewして そのメンバ関数を使用する方法 -------------------------------------------------- (結果) レジストリ登録をしていないと 「CLSID{・・・}のCOMオブジェクトが有効でない」云々というエラーに。 それを受けて手動で該当するDLLのレジストリ登録を行った後だと 「オブジェクト参照がオブジェクトインスタンスに設定されません」というエラー。 (ということは、クラス生成に失敗している?) (2)----------------------------------------------- 上記のようにDllImportで実装する方法 (ちなみにそのDLLがエクスポートしている関数は DllCanUnloadNow, DllGetClassObject, DllRegisterServer, DllUnregisterServerの4つ) -------------------------------------------------- (結果) DllGetClassObject以外については関数を呼ぶことができている。 DllGetClassObjectは、引数設定に苦戦して今のところうまくいっていない状態。 (3)----------------------------------------------- インスタンス生成ができていないようなので どこかで調べて見つけてきたCoCreateInstance関数を使用する方法 -------------------------------------------------- (結果) これも引数に何を渡してよいかわからず試行錯誤中。 DLLの読み込みの時点でこけているかと予測して そのあたりが解決すればよいのかな・・・といろいろ試していますが WindowsプログラミングやCOMがよくわかっていないので 何が正解で何が間違っているのかさっぱりわからず、 周りに聞いても精通している人がいないためどうしようもなくなっています。 どんな些細な手がかりでもよいので 突破口になりそうなアドバイスがあれば教えてください。 よろしくお願いします。

  • VBとVC++を両方使うプログラム(VS2008)

    VBとVC++を両方使うプログラムのデバッグなんですが、VBとVC++を両方使って作ったプログラム全体を一つのソリューションにまとめて統合環境で動かしてデバッグしたいです。VS2008でVBとVC++を両方使うプログラムの作り方をサンプル付で説明した本はありませんでしょうか? MSDN読んでもさっぱりわかりません。アンマネージかマネージかアクティブXかというと、dllのほうは基本的にOpenGL使うためなので当面はアンマネージでいいかも。でも今後はマネージドになっていくのでしょう。 VB6/VC6の頃はVC++でdllを作ってVBから呼び出してましたが、デバッグのときにdll側にバグがあるとVB側からどういうデータが来ていたのかわからずに苦労していました。まとめて動かして変数の値を追えれば便利です。 無理せず一つの言語でやれといわれそうですが、やはりVCの方が速度は速いし何よりも両方使えれば両方のサンプルコードが使えるので便利だし、何よりC++を使わないと上達しないのでやるしかありません。そんなわけでよろしくお願いします。

  • VC++6.0で作成したクラスをVB6.0で使うには?

    初めて投稿します。 プログラミング初心者の為、初歩的な質問になるかもしれませんがご容赦下さい。普段、主にVisual Basic6.0(以下VB6.0)でプログラミングを行なっています。 VB6.0には演算子のオーバーロードする機能がない(?)ため、Visual C++6.0(以下VC++6.0)でプログラミングを行い、VC++6.0で作成したクラスをVB6.0で呼び出して使用したいと考えています。 インターネット上でいろいろと調べてみたのですが、その方法がわからず投稿させていただきました。VC++6.0で作成したDLLの中の関数をVB6.0で呼び出して使用する方法はわかったのですが、クラスということになると、DLLでは無理なのでしょうか? どなたか、VC++6.0で作成したクラスをVB6.0で呼び出す方法、または勉強方法(教材)などを教えていただけると助かります。 宜しくお願いいたします。

  • VC++6.0で作成したDLLのクラスをVB6.0でインポートするには?

    VC++6.0で作成したDLLのクラスをVB6.0でインポートするにはどうしたらいいのでしょうか? 通常の関数なら__declspec(dllexport) __stdcall を書き,defファイルにEXPORT指定することで解決できたのですが,クラスごとエクスポートする場合にはVC側,VB側の記述をどのようにすれば良いのでしょうか?

  • VC++6.0からVB.NETで作成した関数を呼ぶことができますか?

    VB.NET(Visual Basic 2005 Express Edition)でクラスライブラリ(AAA.dll)を作成し、BBBというModuleにCCCというFunctionをひとつ作成しました。 そのFunctionをVC++6.0で作成したプログラムから呼び出すことは可能でしょうか?また、可能な場合はどのような手順で呼び出すことができるのでしょうか? ■VB6.0でDLLを作成した場合 DLLのファイル名とFunction名さえ指定すればVC++6.0よりLoadLibrary、GetProcAddress関数を使用して呼び出せる。 ■VB.NETでDLLを作成した場合 DLLのファイル名+Module名+Function名という構成になってしまい、従来のLoadLibrary、GetProcAddress関数ではModule名が指定できないように思われるのですが・・・どうなんでしょう。 ご存知の方いらっしゃいましたらご教授お願いいたしますm(_ _)m

専門家に質問してみよう