2

シリアル ポートを介して組み込みコントローラ通信バスと通信するための古いレガシー アプリケーションがあります。誰かが開発したもの。

アプリケーションは VB6 で書かれており、アプリケーション GUI プロジェクトを使用して、接続および通信ロジックを処理する DLL の 2 つのプロジェクトとして構成されています。

既存の DLL をそのまま使用する新しいアプリケーション GUI (理想的には C++) を作成できることを望んでいましたが、それをインポートする方法について多くの問題を抱えています。

この古い DLL をそのまま C++ プロジェクトに使用することは可能でしょうか? または、C# プロジェクトにインポートすることは可能ですか? またはVB.NETプロジェクトですか?(VB を使用したくないのですが、必要に応じて使用できます)

今いる場所:

既存のコンパイル済み実行可能ファイルと DLL があり、これらはシステムで実行されます。

プロジェクト ファイルもあり、メモ帳 ++ ですべて読み取り可能ですが、VB6 を持っていないため、プロジェクトを Visual Studio VB.NET 2008 Express にインポートするのは簡単ではありません。特に、最初に掘り下げて試すための実際の例がなければ、そうではありません (DLL プロジェクトはインポート可能かもしれませんが、アップグレード レポートで変更が必要であると示されているものが 50 以上あります。また、私にとって非常に重要と思われる 3 つの .cls ファイルを無視しているようです)。特にVB6に精通した目ではありません...アプリケーションプロジェクトには、アップグレードレポートに「設計時のライセンスがありません」というメッセージがあり、インポートされたプロジェクトのプロジェクトエクスプローラーに実際に表示される唯一のプロジェクトファイルはプロジェクトファイル自体です、およびアセンブリ情報ファイル)。

DLL を VS C++ にインポートする方法のほとんどの例では、DLL プロジェクトを使用するプロジェクトと一緒に適切にコンパイルされるソリューションがあることを前提としています。または、少なくとも .DLL と .lib と .h ファイル... コードの元の開発者 (別の都市では直接作業していません) と話し、.dll と一致する .lib を取得しましたが、それでも.h ファイルがありません。

私は通常、何か新しいことを打ち破るのは問題ありませんが、理解を得ることができるVB6であっても、プロジェクトのベースラインの実例がなければ、これは非常に難しくなります。また、グーグルがネット上で見つけることができる場所に同様の質問がないため、これが私が試みるべきものであるかどうか疑問に思います.

それが違いを生む場合、私はビジュアルスタジオの非エクスプレスコピーを取得することに取り組んでいます(エクスプレスは今まですべてでうまく機能していたので、それ以上は必要ありませんでした)が、おそらく数週間かかります.

どんな提案でも大歓迎です。

読んでくれてありがとう!

4

1 に答える 1

1

私はこれを行った経験がないため、これを否認する必要がありますが、この件に関するドキュメントを読んだだけで、それが可能であることがわかっただけです。

VB から .NET へのインポート/変換プロセスがうまくいくかどうかはわかりません。既存の dll はおそらく COM オブジェクトですよね?

COM オブジェクト dll を使用して C++ から始めるための MSDN ドキュメントがいくつかあるようです - そして、#importディレクティブはいくつかの .h (ヘッダー) ファイルも生成するようです。

http://msdn.microsoft.com/en-us/library/8etzzkb6.aspx

したがって、単純に#importディレクティブを追加してみます。

#import "somelibrary.dll"

Visual Studio が生成するものを確認します。

次の例も見てください(別のフォーラムから恥知らずにコピーされました)。

 #import "F:\proj\VB6\ActiveXDLL\VBTestDLL.dll"
 using namespace VBTestLib;

void CDialogTestDlg::OnButton1() 
{

 HRESULT hresult;
 CLSID clsid;
 _CTest *t; // a pointer to the CTest object
 _bstr_t bstrA = L"hello";
 _bstr_t bstrB = L" world"; 
 _bstr_t bstrR;
 ::CoInitialize(NULL);
  hresult=CLSIDFromProgID(OLESTR("VBTestLib.CTest"), &clsid);
  hresult= CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,
                               __uuidof(_CTest),(LPVOID*) &t);
  if(hresult == S_OK)
  {
     bstrR  = t->vbConcat(bstrA , bstrB);
     AfxMessageBox((char*)bstrR);
   }
 }
于 2012-05-21T02:12:06.323 に答える