2016-05-05 3 views
1

私が取り組んでいるレガシープロジェクトの新しい機能を開発する必要があります。私は現代のIDEでそうしたいと思います。レガシーコードはVC++ 6で開発されたので、VS2013でこの追加ライブラリを開発したいと思います。ちょうど文脈のために、これはRFID認証システムで使用されます。VC20.0と下位互換性のあるVS2013でDLLを作成する

これが問題になりますか?概念的には、ライブラリには、エクスポートされる関数が4つあります:OpenReaders()CloseReaders()、およびValidateTag(int reader)です。それはもっと多くのエクスポートされた関数を持つかもしれませんが、それらは私が開発する別の外部プログラムのためにのみ使用されます。そのプログラムはデータベースを構成するために使用され、それがライブラリ自体によって使用されます。他のすべてはDLLに自己完結しています。

ここで、VC++ 6.0から新しいバージョンのStudioにプロジェクトを移行する際に、Unicode文字に問題があることがわかりました。現在のプロジェクトをStudio 2013にアップグレードしようとしたときにこれらの問題が発生し、大成功を収めました。しかし、むしろ支配的な同僚(私の上司ではないが、私と一緒に牛肉を持っていて、彼が私を上司に報告するときに彼の方法を得る傾向がある;通常これは私たちがソリューション)私はVC++ 6.0に戻りました。しかし、新しいDLLを古いコードベースと対話させようとしているときに気づいていない、他の複雑な問題があるはずです。

+0

なぜ近い投票ですか? – audiFanatic

+0

あなたが考慮する必要があるのは、DLLに送信するパラメータの型とそれらのDLL関数の戻り値の型だけです。タイプが 'LONG、BOOL、LPCTSTR'などのWindowsタイプの場合は、何も問題はありません。一方、 'std :: vector'、' std :: string'などの型を送信している場合、それはうまく動作しません。 – PaulMcKenzie

+0

bleh ...標準に従わないようにMicrosoftに任せてください。私がPOSIXプログラミングを好む理由があります。 だから、 'std'の型を使うとどうなるでしょうか?私はそれが別の方法であることを期待していただろう。 第2に、繰り返して言えば、DLLに含まれている型の問題ではありません。私が渡しているものだけです。それは 'int'だけになるので、何の問題もないことを願っています。 – audiFanatic

答えて

2

あなたが考慮する必要がある主なものは、DLLのエクスポートされた関数に送信するパラメータの種類とそれらのエクスポートされた関数の戻り値の型です。タイプは、Windowsの種類、すなわち

LONG, BOOL, LPCTSTR,

などであれば...

、問題があってはならない、またはいずれかの問題がある場合は、簡単に解決。

ただし、DLLがUnicodeであり、アプリケーションがMBCSであり、文字列型が途切れることがあります。しかし、これを回避する方法があります。たとえ昔のVisual C++ 6.0であっても、Unicode文字列を入力したり、文字列を受け取ったりする方法があります(少なくともWindows 2000ではMultiByteToWideCharWideCharToMultiByteを使用しています)。

一方、std::vector,std::stringなどのタイプを送信している場合は、うまく機能しません。その理由は、これらの型はコンパイラ間で内部実装が異なるため、Visual Studio 6.0からDLLに渡されるstd::stringは、Visual Studio 2013が使用しているものと同じではありません。

最後のシナリオのように修正するのは難しく、VS 6.0コードとDLLコード(文字列タイプの代わりに文字バッファを送信し、T*std::vector<T>の代わりにサイズを送信するなど)を大幅に変更する必要があります。 )

関連する問題