• ベストアンサー

言語仕様の特定

こんばんわ。 いつもお世話になっております。 現在請け負っている仕事で困ったことがございましたこちらにご相談させていただきました。 今回の仕事内容は「現在稼働中の既存のDLLを再作成する。」という内容です。 詳細としてはWindows2000Server動作している既存のDLLがあるのですが、機能改訂を行うこととなりました。 ところが元のDLLのソース一式が存在しないため、代替案として一から再度作成するという流れになりました。 DLLの名称やメソッド名、処理内容等はドキュメントがあるのですが、環境まわりのドキュメントが一切なく どのような言語でどのような形式でDLLを作成すればよいのかがわからない状況です。 ただ、呼び出し元アプリの設計書を参照すると以下のような記述が存在しました。 ・エントリーポイントを「_stdcall」または「FAR PASCAL」として宣言する ・MFCで作成されたDLLは利用できない ・呼び出し元はマルチスレッド環境からDLLを呼び出すのでスレッドセーフに作成すること。 恐らくC++あたりの言語だろうという想定はつくのですが、具体的にどういう環境でどういう形式で アプリケーションを作成すればいいのかがわかりません。 上記の情報で開発環境やそれにまつわる情報が解読できる方いらっしゃいましたらご助言頂けません でしょうか? 情報が不足しているのは重々承知していますので予測や一般論でも結構です。 無謀なお願いとは思いますが、何卒宜しくお願い致します。

  • kbiz
  • お礼率82% (19/23)

質問者が選んだベストアンサー

  • ベストアンサー
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.2

Visual C++ 2008 Express Edition(無料) http://www.microsoft.com/japan/msdn/vstudio/express/beginners/2008/visualc.aspx で要件を満たすと思います。 試しに接続用のDLLを作ってみて確認してみると良いと思います。 確かVisual C++ 2008 Express Editionでも外部依存しない(MFCにも.Net Frameworkにも依存しない) ファイルを作成できたと思います。 DLLがスレッドセーフになるかどうかはコーディングの問題です。 そのようにコーディングすれば問題ありません。 ただ質問者さんはVisual C++を使った経験はないようですので、 最初に覚える事は多いと思います。 (スレッドセーフにする為に必要なAPIの使い方等も覚える必要があります。) 最初のヒントとしてdllのエントリポイント(コンソールプログラムのmain関数)は 「DllMain」という名前ですのでそれでgoo等で検索するとdllの作り方 はわかると思います。

kbiz
質問者

お礼

ご回答ありがとうございます。 VC++でMFCを使用しないDLLを作成するということですね。 MFCにも.Netにも依存しないDLLという意味がやっとわかりました。 スレッドセーフとエントリーポイントはコーディングしながら一つ一つかたづけていきたいと思います。 一点追加で質問があるのですが、本番機のサーバはWindows2000Serverなのですが、その場合にVC++のバージョンというのはどこまで意識すべきなのでしょうか? (VC++2008でも作成可能という認識でいいのでしょうか?) ご回答いただけるようでしたらお願い致します。

その他の回答 (2)

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.3

>VC++2008でも作成可能という認識でいいのでしょうか?) 恐らくVC++2008でも問題無いとは思いますが その環境で私に経験があるわけではないので断定はできません。 それについては実際やってみた方が早いと思います。 ただServer2003以降に使えるようになったAPI等 を使わないように注意することは必要です。 (MSDNのヘルプをみればそのAPIがどのバージョンから対応しているかが 明記されています。) 今調べてみたらまだVC++ 2005 Express Editionもダウンロードできるみたいでした。 http://www.microsoft.com/japan/msdn/vstudio/express/past/2005/ 念の為を考えて、こちらでも良いかもしれません。

kbiz
質問者

お礼

sha-girl様 お世話になっております。 いろいろご親切にありがとうございました。 まずはVC++2005をベースにとりあえず組み始めることから スタートしたいと思います。 やってみないと始まらないですしね。 このたびは大変丁寧にご指導いただきましたまことにありがとうございました。

  • don_go
  • ベストアンサー率31% (336/1059)
回答No.1

新規に作り直すのであれば、DLLを呼び出す側の言語および 呼出し方法に合わせられる言語を選択するしか無いのでは? #既存のDLLを作成したのと同じバージョンの言語が既に #販売終了していて、入手できない事も考えられます。

kbiz
質問者

お礼

ご回答ありがとうございます。 ご指摘のとおりです。 その呼び出し方法に合わせられる言語が情報が不足しておりまして、現状入手できる条件からたどっていこうと考えた次第です。 ありがとうございました。

関連するQ&A

  • C言語の参考書購入にあたって

    現在C言語の勉強をしています。 参考書を購入する資金が少なく、 どの参考書を買えば迷ってしまいます。 多くの開発者のお勧めは、署 林 晴比古 氏の「改訂シリーズ」がわかり易いと聞いていいます。 現在コンパイルなどの作業は、Visual Studio6.0の VC++6.0を利用してやっています。 MSDNのヘルプを検索してもイマイチ理解に苦しみます。 覚えたい概要は・・・ 外部から入力されてくるデータを タイムスタンプ、時間などを取得し、 テキストファイルに格納させ、 なおかつ改行する。 テキストファイルがない場合は新しく作成する・・・ 上記の内容が入ったDLLの作成方法。 内容は一つ一つ理解は出来てきているのですが、 基本的なDLLの作成方法、が詳しく説明しているような 文面が記述しているものか、 ヘッダファイルの作成方法が詳しく記述している・・・ 参考書を探しています。 現在本当にお金が少なく、一冊ぐらいしか 買えそうもありません。 よろしくお願いします

  • C#の仕様諸々について

    諸事情あって 数時間前 初めてC#の仕様に触れ、初めて実際にいじってみました。 で、細かいとこ全然違うなーとか思いながら 色々と考えてみたのですが とりあえずこれ CやC++での#include とかに当たるものが何も書かずに自動化されてる、ような感じでしょうか この仕様だと 数万行程度の規模のプログラムだったら良いかもしれませんが もっと増えて仮に10万行越えるとかくらいになってくると、開発環境がちゃんと反応できるか心配です。 そう言う場合って 仮に個人で作るとして 尚且つC++だったら普通動的ロードしないような必須機能であったとしても やっぱりアセンブリの分割を(別途dllに)するのが良いということになるのでしょうか? またinternalを使った場合 外部のアセンブリから使えない→開発環境に自動チェックされる量を減らせる と考えて良いのでしょうか? あるいは、C#は、もともとそこまでは大規模なプログラム向けの言語ではないのでしょうか? そんで、分割の時のことなんですが DllImportで 関数ポインタぽいものを作る時に (意味的に、C・C++でいう)ポインタを引数にとるって事が通常考えられるじゃないですか。 その時なんですけど using System; using System.Runtime.InteropServices; namespace WindowsFormsApplication1 { public partial class Form1 : System.Windows.Forms.Form { [DllImport( "kernel32.dll", CallingConvention = CallingConvention.StdCall )] extern static short QueryPerformanceCounter(ref long x); [DllImport("kernel32.dll", CallingConvention = CallingConvention.StdCall)] extern static short QueryPerformanceFrequency(ref long x); public Form1(){ InitializeComponent(); long cnt = 0, frq = 0; //(1) QueryPerformanceCounter(ref cnt); QueryPerformanceFrequency(ref frq); ・ ・ ・ どうやらこういう風に (1)のところで初期化がいると思うんですよね。 で、あきらかにこれ内部で書きかえられることを想定してるんだから 初期化なしでやりたいんですが 初期化なしでやる場合は outに変える必要があると聞きました。 [DllImport( "kernel32.dll", CallingConvention = CallingConvention.StdCall )] extern static short QueryPerformanceCounter(out long x); [DllImport("kernel32.dll", CallingConvention = CallingConvention.StdCall)] extern static short QueryPerformanceFrequency(out long x); ・ ・ ・ long cnt, frq; QueryPerformanceCounter(out cnt); QueryPerformanceFrequency(out frq); でもこの場合って、実際には中身は書き変えられないかもしれないですよね? その辺はDllImportの場合(自分のアセンブリ内のことしか)関知しないってことでしょうか? それから ・C++などでいうconst(C#ではメンバに付けるreadonly的)なローカル変数 ・同じく、constあるいはreadonly的な、関数への参照渡し(ref) といったものは言語仕様上ない、のでしょうか?

  • .NET言語のクラスはどの言語でも互換性がある?

    表題のような話を聞いた事があるのですが、真偽はどうなのでしょうか? 例えばC++.NETでDLLを作成し、それをC#.NETの開発で利用可能などと。 .NETFrameworkが仲介する事で言語の依存性を無くすらしいのですが、 そういった利用は可能なのでしょうか? また、利用出来る場合、以下のはどうなのでしょうか?  ・利用出来ない場合というのも存在するか?  ・.NETFrameworkを利用していない言語(例えばC++、   C++.NETのネイティブコンパイル、VBなど)でも   利用する事は可能?

  • VC++でDLL、エントリポイントが出来ない?

    VisualStudio2010 VC++でDLLを作成し既存のDelphiXE2アプリで利用したいのですが MSのサンプルソースそのままでDLLを作成しても、__stdcall;しても、Delphiの読み込み時に 「エントリポイントが見つかりません」と言われます。 http://msdn.microsoft.com/ja-jp/library/ms235636.aspx ソースはMSのチュートリアルそのままです。 ためしに VS2010のツール dumpbin.exe /exports ????.dll と中身を覗くと 1 0 ooo11104 ?Add@MyMathFuncs@MathFuncs@@SGNNN@Z 2 1 ,,,,,,,,,,,,,, のような表示とSummary 以下しか表示されずスタティックライブラリにしても中身は同じです。 それでは、と他のDLLをいくつか覗いてみましたが、大概のDLLやLIBファイルを覗くと すっきりしたきれいな関数名の一覧がdumpbin /exports で表示されます。 では、DLLになっていないのかというと、作ったDLLを同じVC++でチュートリアル通りに 呼び出すと何の問題もなく使えますので、多分正常なのでしょう。 しかし、どうして エントリポイントの一覧が見える形にならないのか分かりません。多言語で利用するには 必要かと思います。 VC++で作成したDLLやLibが他の環境で使えないとは考えられないので、なにか、常識的な 部分を知らないのだと思いますが、どなたかよろしくお願いします。

  • Accessで作ったアプリをC言語でつくり直し?

    現状、Access2003で業務用のアプリケーションを 作成しています。 しかし、上司から、C言語で作りかえるよう指示が ありました。 理由は、パソコン環境に依存しないから で、私もそれほどC言語に詳しくのないので 調べて見ましたが、 テキストベースのプログラムの書き方や変数の宣言 などの情報はあるのですが、 じゃあ、Accessで作った入力用のフォームとか 入力した内容を印刷するための帳票(レポート)などは どのようにしてC言語で実現するのかが、わかりません。 C言語でGUI環境を作り出し、なおかつデータベース機能を 持たせることはできるのでしょうか

  • AccessVBAからC言語のDLLの呼び出し方

    初心者です。はじめまして お世話になります。 概要:C言語で作成したDLLをVBAで呼び出す。 タイトルの通り、C言語で作成したDLLをVBAで呼び出したいのですが、うまく 呼び出すことができず、「エラー番号:49 DLLを正しく呼び出せません。」 というエラーが返ってきてしまいます。 DLLの作成手順もしくはDLLの呼び出し方でおかしな所があればご指摘頂けない でしょうか? C言語のDLL、作成手順は以下の通りです。 DLL作成環境:Visual C++ 6.0 DLL作成手順----------------------------------------- (1)プロジェクトをDLL用に作る  新規作成→プロジェクト→Win32 Dynamic-Link Library→空のDLLプロジェ クト (2)ファイル追加  ソースファイル+すべてのヘッダファイルを追加 (3)DLLを出力対象の関数に「_declspec(dllexport)」をつける 例)------------------------------------- _declspec(dllexport) short dlltest (char *str1, char *str2) --------------------------------------- (4)char を unsigned char へ変換する(/J コンパイルオプション) (5)プロジェクトをデバッグモードからリリースモードに切り替える (6)ビルド実行 (7)「Release」配下に.dllとlibができる。 -作成手順完----------------------------------------------------- 実際のVBAのDLLの呼び出しは以下の通り行っています。 -AccessVBAにてDLLの宣言及び、呼び出し------------------- '呼び出し宣言 Public Declare Function dlltest _ Lib "C:\Project\Dlltest\Release\dlltest.dll" _ (ByVal st1 As String, _ ByVal st2 As String) As Integer 'DLL呼び出し KEKKA = dlltest(string1, string2) -呼び出し完------------------------------------------------ これで実行するとエラーが返されていまいます。 なにぶん、初心者で今回初めてVBAでのプログラミングを行っているので観点 の抜けなどが多分にあると思われます。 どんな小さなことでもご指摘頂けないでしょうか? 宜しくお願い致します。

  • C言語を用いた環境変数の作成/削除方法

    C言語でプログラムを組んで、 以下の2点を実施したいと考えています。 ・任意の名前の環境変数を作成したい。 ・既存の環境変数(自分が任意に名前をつけて作成した環境変数)を  削除したい。 実現するにはどうしたらよいでしょうか? (作成はputenvでよいでしょうか? 削除については調べたのですが分かりませんでした。) お手数ですがご回答いただけると幸いです。

  • 64ビットWindows上でアセンブリ言語

    こんにちは。 現在、OSは現在、64ビット版のWindows7を使っています。 このWindows7上で、アセンブリ言語によるプログラミングを行いたいと思っています。 どうして今頃アセンブリ言語なのかといいますと、会社の研修で、C言語による組込みソフトウェア開発を学ぶ際に、アセンブリ言語も学習するらしいので、少し予習してみようと思いました。 そこで、64ビット環境でも動作するアセンブラを探してみたのですが、 なかなか見つからず、困っています。 ネット上の情報を頼りに色々と試したのですが、作成した実行ファイルをいざ実行しようとすると、「64ビット環境では動作しない」といった内容のメッセージが出たりして、 どうしても動作してくれませんでした。 64ビット版のWindows上で、アセンブリ言語によるプログラミングができている方がいらっしゃれば、どうやってできたのかを、是非教えて頂きたいです。 必要であれば、インストールすべきソフトウェアの一覧と、環境設定方法なども、簡単に説明して頂ければ、大変助かります。 あと、動作確認を行う簡単なサンプルプログラムも、提示して頂ければ大変助かります。 (なにせ、アセンブリ言語に関する知識がゼロなものですので。) では、よろしくお願い致します。

  • 異なる複数の言語から共通モジュールを呼び出す方法

    4つの独立したサーバで、それぞれ異なる言語で記述されたシステムが1つずつ稼動しています。例えばC++、Java、PHP、Rubyとします。 これら4つのシステムに同一の機能追加を行いたいと考えているのですが、4つの言語でそれぞれプログラムを作成するのは大変なので、何とか1つで済ませることは出来ないかとやり方を探っています。 例えばCで「myCommon.dll(またはmyCommon.so)」という共通モジュールを作成したとして、C++、Java、PHP、Rubyで稼動している各システムからこの共通モジュールを呼び出す方法はあるのでしょうか?(共通モジュールは各サーバに1つずつ配置する予定です。ネットワーク越しに実行するわけではありません。) 一応、共通モジュールを実行形式にして、各システムからexec関数などを使用して呼び出すことは出来るようなのですが、共通処理を実行形式で置いておくのが何となく気持ち悪いのと、関数が複数定義してある場合にコマンドラインオプションで処理を振り分けないといけなくなるため、スマートなやり方では無いのではないかと感じています。 理想的なのは、共通モジュールに定義された関数を、それぞれの言語でネイティブな関数のように呼び出せることなのですが・・・。 このように複数の言語から呼び出されるような共通処理を作成する場合、「常套手段」のようなものはあるのでしょうか?

  • ダイアログベースアプリのDLL化の方法について

    ダイアログベースで作成してあるアプリexeを DLL化するのですが、その方法が分かりません。 ダイアログの使用はやめるつもりです。 これまでやってみたことは、 プロジェクトのプロパティで、EXEファイルからDLLに設定を 変更しました。 http://hp.vector.co.jp/authors/VA019517/howtodll.html サンプルを見て、既存のソースに__stdcallなどを記載したいのですが DLLが作成されませんでした。 新規にプロジェクトを作成して、サンプル通りにやった場合は DLLが作成されました。 呼び出したい関数は、別々のファイルですが、 1つのファイルにまとめる必要がありますか? ダイアログベースはやめます。 この2つの関数は、同じDLLにします。 ↓DLL化するソース。ここを外部EXEから呼び出したい。 Test_aa_App.cpp --------------------------------------- CTest_aa_App::InitInctance(){ //初期化処理 } ↓呼び出し対象DLL Test_bb_Dlg.cpp -------------------------------- CTest_bb_Dlg::Test() { // 処理 } 初歩的なことだと思いますが、まず、どのように ソースを変更すれば良いか教えてください。 VS2003 C++6.0 よろしくお願いします。

専門家に質問してみよう