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がよくわかっていないので
何が正解で何が間違っているのかさっぱりわからず、
周りに聞いても精通している人がいないためどうしようもなくなっています。
どんな些細な手がかりでもよいので
突破口になりそうなアドバイスがあれば教えてください。
よろしくお願いします。
お礼
osqlをキーワードにいろいろ検索し、BACKUP/RESTOREで出来ることが解りました。 実際にはosqlは使用しませんでしたが、下記で成功しました。 BACKUP DATABASE データベース名 TO DISK= 'バックアップファイル.bak' WITH INIT ヒントを頂きありがとうございました!