dllとは、プログラムが実行時に参照するものですよね。
よく使われる機能があらかじめ作られているものですよね。

私はC言語しか知らないので、C言語でプログラミングすることで話を進めさせてください。
(とは言っても、ごく初歩的なプログラムが組めるだけの素人です。)
OSはWindowsということにします。

C言語は、関数の集まりでソースが書かれています。
dllも、中身に関数の実体が記述されている、そういうイメージでしょうか。

私がもっと勉強して、複雑なプログラムを組んだりすると、
「あ、これはdllに実体がある機能だから、いちいち実装を書かなくてもいいんだな」
と考えて、ソースファイル( ~.c )の中でその関数を使うだろうと思います。

私がよくわからないのはここからです。
dllにある関数をソースで使って、無事コンパイルして、さあリンクしてexeを作りましょう、
というときに、リンカ(リンクを行うプログラム)は、
「そんな関数、実体がないぞ」
って文句を言ってこないのでしょうか。

いや、リンカは、dllに実体がある関数だということを知っているはず。
でもそれって、いちいち
「この関数はどこどこにある ○○.dll というdllに書いてあります」
というふうに、リンカに教えてあげなくてはいけないのでしょうか。
(それってまさか、ソースに書くわけじゃないですよね? )


それから、
exeファイルっていうのは「この機能はdllに行わせる機能だ」ということを知っているのでしょうか。

dllに行わせる機能だということを知っているとしても、
どのディレクトリにある なんと言う名のdllに その機能が書かれていることまで知っているのでしょうか。
(でもそこまで知っていたら逆に、ディレクトリ構成の違うマシンでは実行できなくなってしまうし。)

そういうような原理的なことを教えてください。

このQ&Aに関連する最新のQ&A

とは DLL」に関するQ&A: MFC71.DLLとは

A 回答 (5件)

どちらも、ダイナミックリンクというのだと思うのですが、そのリンク方法の中に、スタティックな方法(hとLIBを用いる方法)とダイナミックな方法(LoadLibrary()とGetProcAddress()を使う方法)とがあるという・・・まさしく訳が分かんないんですけど、とにかく、DLLのリンク方法には大きく分けて2種類有るんです。

(^^;

>「○○.dllが見つからない」というエラーですね。
その通りです。

>「コード内にDLLファイル名を記述する必要があるわけです」というのは、.LIBを作るときの話ですよね?
>要するにソース中に"C:\\exsample\\exsample.DLL"みたいに直接書いてあったらそこを探しに行くということでしょう(たぶん)。

いわゆるダイナミックなリンク方法のとき、3番の回答者のおっしゃるとおり、LoadLibraryの引数にはDLLファイル名を指定する必要があると言うことです。
このとき、フルパスでもパス無しでも指定できますが、パス無しの時は2番の参考URLに書いて有るとおりの検索順序でDLLを探しに行きます。

LIBをつくるにはlibというVC++のツールを使うか、Borlandのimplibというツールで作れるようです。

ダイナミックリンクのメカニズムの説明が不足していましたね。3番の方ありがとうございます。質問者には混乱させてすみませんでした(^^;

この回答への補足

わかりました。ダイナミックリンクには、スタティックな方法とダイナミックな方法の二つがあるんですね。
すっきりとしました。

>いわゆるダイナミックなリンク方法のとき、3番の回答者のおっしゃるとおり、LoadLibraryの引数にはDLLファイル名を指定する必要があると言うことです。

わかりました。ダイナミックな方法のときには、DLLファイル名はソースコード中に書かなければいけない、ということですね。

なんだか、難しそうな、ダイナミックな方法のほうが良くわかってきました。


スタティックな方法のほうですが、突っ込んでいいですか。(^^;
.LIBファイル中にDLLファイル名が記述されていてそれがリンク時に参照されるから、実行ファイルは、実行時になんという名のDLLを見に行くか、判断できる。
しかし、リンク時になんという名の.LIBファイルを参照すればよいのか、そしてそれはどこにあるのかは、リンクをするプログラム(リンカ)が知っていなければいけないですよね。
.LIBファイル名とそのパスはどのように教えるのでしょうか。

(私が今このサイトを見ているパソコンでは、.LIBファイルなんて2つしかないですが、開発環境のあるマシンではいくつも.LIBファイルがあるんですよね。)

(回答#2より)
>参考URLのLoadLibrary()のヘルプにもLoadLibrary()自体がどのDLLに記述されていてどのLIBをリンクし、どのヘッダをインクルードすればよいかが最後に書いてあります(ただし、VC++はほとんど自動でやってくれますけどね)。

VC++が自動的にやるということですが、リンク時マシンじゅうの.LIBファイルを片っ端から見に行くのでしょうか。(パスくらいは指定するんですよね? それはソースコード中に書くのではないですよね。)

(すみません。しつこい奴だなどと気を悪くなさいませんように。)

あと当然のことかもしれませんが、確認させてください。.LIBファイルというのはリンク時に参照されるものなので、実行時にはなくてもいいんですよね?

補足日時:2001/11/18 19:53
    • good
    • 0

>.LIBファイル名とそのパスはどのように教えるのでしょうか。


VC++ならば、、、ええとプロジェクトメニューの設定でプロジェクトの設定
ダイアログをひらき、リンクタブをクリックして、
オブジェクトライブラリモジュールセクションに記述する、だと思います。
これだとデバッグ時とリリースビルド時個別に設定できます。
で、Win32Applicationを作成するプロジェクトを生成させるとここには、kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.libと言う記述がすでにされているため、「ほぼ自動でできる」んだと思います。LIBファイルのパスは別な場所(ツールメニューのオプションをクリックし出てくるダイアログのディレクトリタブ)で設定があり、インストール時に勝手にやってくれているはずです。足りなければ追加できるかと。追加すべきLIBファイルはやはり自分で調べなくてはなりません。
なお、普通にプロジェクトに追加しても、なぜかちゃんとリンクできたりします(^^;

プロジェクト個別にライブラリを変えることができることを考えると、ライブラリの追加はプロジェクトファイルに記述されているのでしょう(パスは共通設定のようです)。

統合環境でない場合はMakeFile等に記述するんでしょうね、きっと。
ヘッダファイルに関しては、たいていwindows.hをインクルードすれば事が足りるんで(こんな事言うと専門家の人たちに文句言われそうですが)。

>.LIBファイルというのはリンク時に参照されるものなので、実行時にはなくてもいいんですよね?

でないと、開発環境のないパソコンでは実行できなくなりますよね?(笑)

ちなみにLIBが2つしかないと言うことはまず無いと思います。きっとどこかにあるんだと思いますよ。

ダイナミックによるDLLロードが必要になる例を参考URLにあげておきます。
私も素人プログラマなんで(^^;経験が参考になれば幸いです。

参考URL:http://www.microsoft.com/JAPAN/support/kb/articl …

この回答への補足

ありがとうございます。じゅうぶんです。わかりました。

本当におせわになりました。

(「補足」に書きましたが、もうほとんどお礼のつもりです。)

補足日時:2001/11/18 21:15
    • good
    • 0
この回答へのお礼

みなさんありがとうございました。
締め切らせていただきます。特にBLACKTALONさん、ありがとうございました。

>>.LIBファイルというのはリンク時に参照されるものなので、実行時にはなくてもいいんですよね?
>でないと、開発環境のないパソコンでは実行できなくなりますよね?(笑)
>ちなみにLIBが2つしかないと言うことはまず無いと思います。きっとどこかにあるんだと思いますよ。

質問から離れるので流しますが、、、私がこのサイトを見るPC(開発環境はない。)では.LIBはC:\Program Files\ArchiverDLL\UNLHA32にあるUnlha32.libとUnlhavc.libの二つです。
(OSは98SE)


あ、そうそう、私は質問で
>「この関数はどこどこにある ○○.dll というdllに書いてあります」
>というふうに、リンカに教えてあげなくてはいけないのでしょうか。
>(それってまさか、ソースに書くわけじゃないですよね? )
などと書きました。

「ソースに書くわけではないですよね」というのは、今振り返ってみると、
私が「スタティックな方法」を念頭に置いて質問を書いていたからです。

お礼日時:2001/11/19 23:39

横槍気味の解説ですが...



ダイナミックリンクがよくわからなくなるのは
「関数のポインタ」のせいではないでしょうか。
変数に実体をポインタがあって、
(ポインタに格納されている)アドレスからもアクセスできるのだから、
関数にだって実体とポインタがあって、
そのアドレスから実行できる、ということです。

配列名が配列の先頭アドレスになるように、
関数名が関数の先頭アドレスになるのです。

その関数のアドレスを返すのがGetProcAddress関数で、
関数名の文字列を渡すとその関数のアドレスが返ってきます。
このとき「どのDLLを読みに行くか」を指定するのがLoadLibrary関数で、
この関数の戻り値を指定してDLLを選択します。

>パスをハードコーディングしていれば

要するにソース中に"C:\\exsample\\exsample.DLL"みたいに
直接書いてあったらそこを探しに行くということでしょう(たぶん)。

以上、同じくDLLの扱いに苦しんだ者の独り言でした。

この回答への補足

ダイナミックな方法の話ですね。

関数のポインタですね。

intへのポインタ(int*)や 構造体へのポインタがあるように、関数へのポインタがあるわけですね。
intへのポインタapがint型の変数aをさしていれば、*apは aのことですね。
同じように、関数へのポインタがあってそれが関数をさしていれば、関数を直接書くような感じで使えるわけですね。

問題は、それでは、関数のアドレスをどうやって取得するか(言葉を替えると、関数へのポインタが関数をさすようにするにはどうすればよいか)、というところにあるわけですね。

>その関数のアドレスを返すのがGetProcAddress関数で、
関数名の文字列を渡すとその関数のアドレスが返ってきます。

あ、なるほど、わかりました。
ソース中に書いてあるのは、関数名という「文字列」なんですね。

>>パスをハードコーディングしていれば
>要するにソース中に"C:\\exsample\\exsample.DLL"みたいに
>直接書いてあったらそこを探しに行くということでしょう(たぶん)。

以上のことと回答#2を総合すると、ダイナミックな方法の場合には、

「関数名を文字列としてソースコード中に記述し、さらに、その関数があるdllの名前もソースコード中に記述しなければならない。
そのときに、ソースコード中にパスを指定する場合と指定しない場合がある。
ソースコード中にパスを指定した場合は、そのパスにそのdllがなければ、エラーになる。
パスを指定していない場合は、LoadLibrary関数がdllを探しに行く。
(探しに行くディレクトリの順番は、回答#2の参照URLを参照のこと。)」

という具合になっているわけですね。

補足日時:2001/11/18 19:18
    • good
    • 0

DLLの場合、俗にスタティックリンクという方法とダイナミックリンクというリンクの方法と2つあります。


(本当に俗なので正しい呼称は知りません)

まず、スタティックリンクのときは通常通り、.hファイルと.LIBファイルが存在します。
で、普通にリンクできます。
ただし、ライブラリの実体はリンクされず、プログラムの実行時にDLLファイルからロードされる仕組みになっているようです。
このとき、ある順序でDLLを探して無い場合は実行できません。
エラーが出るはずです。
つまり、LIBファイルはどのDLLにどの関数があるかの記述があるのだろうと
思われます。

ダイナミックリンクの時はLoadLibrary()とGetProcAddress()Win32APIを使って関数のポインタを取得することで使用が可能になります。
この場合、.hも.LIBも要らないはずです。この場合はどのDLLにどの関数が入っているかを当然プログラマは熟知し、コード内に記述する必要があります。
DLLの場所に関してはLoadLibrary()の検索順序に当てはまるようにする必要がありますしパスをハードコーディングしていればそのディレクトリにDLLが無いと見つかりません。

なお、最近はDLLのバージョンの違いによる障害・トラブルの解決などいろんな技術によって若干この話が当てはまらないことがあるかも知れないです。

LoadLibraryの検索順序に関しては参考URLの解説をご覧ください。
1番の方はSystemディレクトリにDLLを置くと動作するのはPATHのためだと解説されていますが、Systemディレクトリに関してはPATHよりもLoadLibrary()の仕様であると解釈した方が良さそうです。
ただしPATHが通っているとDLLの関数を実行できることは間違いないです。

どちらにせよ、ライブラリをリンクしたり、ヘッダファイルをインクルードしたり、コード内にDLLファイル名を記述する必要があるわけですから、プログラマはその関数について有る程度知っている必要はありますよね。
参考URLのLoadLibrary()のヘルプにもLoadLibrary()自体がどのDLLに記述されていてどのLIBをリンクし、どのヘッダをインクルードすればよいかが最後に書いてあります(ただし、VC++はほとんど自動でやってくれますけどね)。

参考URL:http://www.microsoft.com/japan/developer/library …

この回答への補足

>DLLの場合、俗にスタティックリンクという方法とダイナミックリンクというリンクの方法と2つあります。

すみません。「DLL=ダイナミックリンク。」だと思っていました。
(DLLは「ダイナミックリンクライブラリ」ですよね。)


>スタティックリンクのときは通常通り、.hファイルと.LIBファイルが存在します。
で、普通にリンクできます。
>ただし、ライブラリの実体はリンクされず、プログラムの実行時にDLLファイルからロードされる仕組みになっているようです。

↑これを「ダイナミックリンク」というのだと思っていました。

>このとき、ある順序でDLLを探して無い場合は実行できません。
>エラーが出るはずです。

「○○.dllが見つからない」というエラーですね。

>つまり、LIBファイルはどのDLLにどの関数があるかの記述があるのだろうと
思われます。

あ、そうか。リンカは、リンクを行うときに、.LIBファイルを見て、
「この関数の実体は○○.dllというdllにあるんだな」
ということを知るわけですね。
リンカは、exeの中に「この関数の実体は○○.dllというdllにある」ということを吹き込むわけですね。
だから、exeは、そのことを知っているわけですね。


>ダイナミックリンクの時は...
すみません。私の頭がついていけません。
ゆっくり考えさせてください。

>どちらにせよ、ライブラリをリンクしたり、ヘッダファイルをインクルードしたり、コード内にDLLファイル名を記述する必要があるわけですから、

(ダイナミックリンクはちょっと理解できていないんですが...)
スタティックリンクのときは .LIBにdll名が書かれているわけだから、
「コード内にDLLファイル名を記述する必要があるわけです」というのは、.LIBを作るときの話ですよね?

補足日時:2001/11/18 09:20
    • good
    • 0

こんにちは、honiyonです。



 ソースコードは、自分自身、というイメージです。
 作成者が、「ソースコード」という形で処理手順等をコンピュータに教えてあげます。 逆に言えば作成者が教えたこと以外は何知りません。

 何がいいたいかというと、宣言した関数が、ソースコードの中にあるか、外部(DLL)の中にあるか、というのも作成者が教えてあげるという事です。
 暇があれば、LoadLibraryという WinAPI32関数について調べてみてください。その片鱗を見ることが出来ます。

 ディレクトリ構成の違うマシンでも何故実行できるか、という点については、PATHという環境変数がカギを握っています。 ディレクトリを指定せずファイルが参照され時、それがカレントに無い場合は自動的に環境変数にかかれているディレクトリの中身を探します。
 WinNT系は、DLLを C:\WINNT\SYSTEM32、Win95系は C:\WINDOWS\SYSTEM32に置きますが、どちらのケースでも同一プログラムが動く理由はここにあります。 そのディレクトリを PATHという環境変数に書いているためです。

 頭がまわってないのでうまく説明出来ているかちょっと心配ですが...(^^;
 参考になれば幸いです(..

この回答への補足

ありがとうございます。

>何がいいたいかというと、宣言した関数が、ソースコードの中にあるか、外部(DLL)の中にあるか、というのも作成者が教えてあげるという事です。

ソースコードの中にあるか外部(dll)にあるか、は ソースコードに記述するんでしょうか。
(C言語のことをご存知なら、「dllにある関数である」ということはどのように書くのか、お教えください。
例えばexternっていうのは、コンパイラに「ソースコードにはないけど、他の目的モジュールにありますよ」と教えるもので、dllに書かれているということを教えるためのものではないですよね。)

別な方法でリンカに教えるのでしょうか。

>暇があれば、LoadLibraryという WinAPI32関数について調べてみてください。
すみません。ひまなときにさせてください。(^^;

>ディレクトリを指定せずファイルが参照され時、それがカレントに無い場合は自動的に環境変数にかかれているディレクトリの中身を探します。

>そのディレクトリを PATHという環境変数に書いているためです。

これは、つまり、こういうことですね。
exeは、関数がなんと言う名のdllにあるのか知っているが、そのdllがどのディレクトリにあるのかは知らない。だから、PATHに書かれているディレクトリを探しに行くんだ。

でも、exeは、
関数が「dllにある関数だ」ということは知っていても、「なんと言う名のdllにある関数だ」ということは、なぜ知っているのでしょうか。

補足日時:2001/11/18 08:51
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QJavaの拡張ライブラリをインストールする時にdllファイルを使った

あるJavaの拡張ライブラリ(下記URLのもの)をインストールする時に、extディレクトリにjarファイルを貼り付けて、さらに付属のdllファイルをsystem32ディレクトリに貼り付ける必要がありました。

あまり、拡張ライブラリをインストールしたことがなかったのですが、少し調べてみるとjarファイルをextディレクトリに置くのは普通らしいのですが、dllファイルを使うというのはあまり聞きません。

jarファイルにはクラスが入っていると思うのですが、dllファイルには、どのような意味があるのでしょうか?

よろしくお願いします。

http://sourceforge.net/projects/netsnmpj

Aベストアンサー

どのような拡張ライブラリが詳細は見ておりませんが…。

おそらく、100% Pure Java(純粋なJava APIのみで実装されたもの)で実現できない機能をCやC++などのネイティブコードで書いて、jarファイル内にあるクラスの中でJNI(Java Native Interface)を使用して呼び出しているのでしょう。
dllファイルはそのネイティブコードにあたる部分になります。

なお、この拡張ライブラリは100% Pure Javaではない(環境依存する)ので、その点は注意して下さいね。

Q異なる言語同士(VBとCなど)のプログラムを呼ぶ方法、dllの作成法

VBから自作のCプログラムを呼び出したいです。
ダイナミックリンクライブラリ(dll)を使わない解もあるのでしょう。
私は、Cのダイナミックリンクライブラリ(dll)を自作して、Cから呼び出す方法を探りました。
VCの新規作成メニュに、Win 32 Dynamic-Link Libraryがあるので、これを使えばいいのではと思うのですが、ソースでどう宣言したらいいのか、それをCから、またVBから、どのように呼び出すかがわかりません。WinAPIのように宣言して使うのかなと思うのですが。
なお、.NETでない解決法を知りたいです。

ご存知の方よろしくお願いします。

Aベストアンサー

>そのdllはどこか決まったディレクトリ(ystem32?)におくのでしょうか?

WindowsではこのAPIが検索する順番にファイルが検索されます。覚えておくべきでしょう。
SearchPath
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpfileio/html/_win32_searchpath.asp
ここの1~6のどこかにおく必要があります。
もしくは、DeclareステートメントでDLL名を記述する際に、
フルパスで記述します。


>また、Cから呼び出す場合、どう書けばいいでしょうか?
>簡単なコーディング例があればうれしいです。

VBはActiveXDLLやActiveXEXEなどにする必要があります。
で、これを呼ぶにはCよりもC++が楽ですというか、Cだとちょっとつらいですよ。

googleで、
#import VB DLL

こんなキーワードで調べるとサンプルは出てくると思います。

>そのdllはどこか決まったディレクトリ(ystem32?)におくのでしょうか?

WindowsではこのAPIが検索する順番にファイルが検索されます。覚えておくべきでしょう。
SearchPath
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpfileio/html/_win32_searchpath.asp
ここの1~6のどこかにおく必要があります。
もしくは、DeclareステートメントでDLL名を記述する際に、
フルパスで記述します。


>また、Cから呼び出す場合、どう書けばいいでしょうか?
>...続きを読む

QDLLファイルのインストールができません。

WIN95を再インストールしたのですが、エクセル97を起動しようとすると、
「起動にはOLEAUT32.DLLが必要です。セットアップメニューより再インストールしてください」と表示されたので、スタート~検索~で調べると、同名のファイル(ただしWIN2.1用)がありましたので、これ削除しようとすると「このファイルはウィンドウズ95内で使用中のため削除不可」というコメントが出ます。仕方なく、他のパソコンから95用バージョンの同名ファイルをFDDにコピーしてC¥WINDOWS¥SYSTEMにコピーしようとしても、「同名のファイルがあるため不可」の表示が出て前に進みません。他のインストール法をご存知の方、どうか教えてください。

Aベストアンサー

#2一部訂正

ごめんなさい。タイプミスです。
「copy a:\oleaut32.dll c:\windows\sysytem」

「copy a:\oleaut32.dll c:\windows\system」
です

QFortranプログラムからC言語で実装された関数を呼ぶには?

Windows Vista Home PremiumにFTN95をインストールしたPCにて、Fortranのプログラミングをし始め、「Cpad for Salford FTN77」を利用してプログラミングをしています(FORTRAN77・Fortran90ともに)。FTN95でのFortranプログラミングに際し、FortranプログラムからC言語で実装された関数を呼ぶには、どのように対処すれば可能になりますでしょうか?
ユーザーガイドによれば、「Fortranプログラム中に、C_EXTERNALという宣言をした関数は、Cの関数と同じくアクセスできるようになり、C側では、#extern <返り値>関数名(引数)を与えれば、Cの関数として呼び込むことができる。」とのことがかかれています。
実際に使っているファイルをいくつか書き出します。

<D:\fortran\sample.f>
C_EXTERNAL WRITE 'WriteFile' : INTEGER*4
INTEGER*4 RESULT
RESULT=WRITE()
write(*,*) result
return
end
<D:\fortran\sample.c>
#extern int Writefile(int);
<C:\Program Files\Silverfrost\FTN95\ftn95c.bat>
ftn95.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 /link

ちなみに、「Cpad for Salford FTN77」での実行/設定/実行/コンパイル時のパラメータは「/link /dreal」です。もちろんftn95.exeへのパスは通してあります。何が問題でしょうか?
何分初心者ですので、拙い質問かと思いますが、何卒ご教示願います。

Windows Vista Home PremiumにFTN95をインストールしたPCにて、Fortranのプログラミングをし始め、「Cpad for Salford FTN77」を利用してプログラミングをしています(FORTRAN77・Fortran90ともに)。FTN95でのFortranプログラミングに際し、FortranプログラムからC言語で実装された関数を呼ぶには、どのように対処すれば可能になりますでしょうか?
ユーザーガイドによれば、「Fortranプログラム中に、C_EXTERNALという宣言をした関数は、Cの関数と同じくアクセスできるようになり、C側では、#extern <返り値>...続きを読む

Aベストアンサー

ftn77 と ftn95 で違ったりするみたいですね。
コンパイルオプションでどうにかなるのかもしれませんが、とりあえずC側のファイルの関数名を

hello から HELLO のように全部を大文字にしてください。
これでリンクが通るようになると思います。

QNorton Internet Security 2004のアンインストールに関して、 NAVShExt.dllファイルが削除できません。

インストール後起動しないので再インストールしたくてやったのですが、Norton Internet Security 2004のアンインストールが成功しません。コントロールパネルからの削除ができなかったので、テクニカルサポートで調べながら、レジストリキーの削除、Cドライブの中のSymantec関連のファイルを手動で削除しました。2003試用版のアンインストールが不完全(LiveRegとLiveUpdate削除済みでしたが)の可能性もあるとのことで、削除ツールはSymsetup.exeとRnisUPG.exeとRnav2003.exeを試してみました。
tempファイルもすべて削除しました。
最後にどうしても削除できないファイルが[C:\ProgramFiles\Norton Internet Security\Norton AntiVirus\NAVShExt.dll]です。
このファイルに何かしようとすると次のメッセージが出ます。
「このファイルは有効なWin32アプリケーションではありません」
「削除できません。アクセスできません。ディスクがいっぱい出ないか、書き込み禁止になっていないか又はファイルが使用中でないか確認してください」
このまま、再インストールしてしまってよいものかどうか...
昨日別の質問で3名の方からご回答いただき、セーフモードでも試したり、削除ツールをさがしたりしましたができませんでした。

インストール後起動しないので再インストールしたくてやったのですが、Norton Internet Security 2004のアンインストールが成功しません。コントロールパネルからの削除ができなかったので、テクニカルサポートで調べながら、レジストリキーの削除、Cドライブの中のSymantec関連のファイルを手動で削除しました。2003試用版のアンインストールが不完全(LiveRegとLiveUpdate削除済みでしたが)の可能性もあるとのことで、削除ツールはSymsetup.exeとRnisUPG.exeとRnav2003.exeを試してみました。
tempファイルも...続きを読む

Aベストアンサー

#3です
以下のURLではだめですか

situation
navshext.dll を削除できません。指定されたファイルは、Windows が使っています。」 が手動削除等でNorton AntiVirus のインストールフォルダを削除しようとすると発生する

http://service1.symantec.com/support/INTER/navjapanesekb.nsf/b0dbf49e05cc8def88256db3005f48d0/57b25753a2aec1c049256bd8001e1f4e?OpenDocument&csm=no&prev=http%3A//search.symantec.com/custom/jp/techsupp/kb/query.html%3F*col=kb*st=1*nh=10*qp=url%3A/INTER/navjapanesekb.nsf;,%20url%3A/INTER/gobackjapanesekb.nsf%20url%3A/INTER/navjapanesekb.nsf%20url%3A/INTER/ghostjapanesekb.nsf%20%0A%09%09%09%09%09%09%09url%3A/INTER/nisjapanesekb.nsf%20url%3A/INTER/nswjapanesekb.nsf%20url%3A/INTER/pcajapanesekb.nsf%20url%3A/INTER/winfaxjapanesekb.nsf%20url%3A/INTER/winfaxjapanesekb.nsf%0A%09%09%09%09%09%09%09url%3A/INTER/sharedtechjapanesekb.nsf%20url%3A/INTER/japanesecustserv.nsf*qt=%8E%E8%93%AE%8D%ED%8F%9C*miniver=*pcode=*la=ja<>&sone=_tasks.html&stg=&prod=&ver=&base=&next=&tpre=jp&src=jp_sg&pcode=

#3です
以下のURLではだめですか

situation
navshext.dll を削除できません。指定されたファイルは、Windows が使っています。」 が手動削除等でNorton AntiVirus のインストールフォルダを削除しようとすると発生する

http://service1.symantec.com/support/INTER/navjapanesekb.nsf/b0dbf49e05cc8def88256db3005f48d0/57b25753a2aec1c049256bd8001e1f4e?OpenDocument&csm=no&prev=http%3A//search.symantec.com/custom/jp/techsupp/kb/query.html%3F*col=kb*st=1*nh=10*qp=url%3A/INTER/navjapanese...続きを読む

Q初めて関数型言語を学ぶとしたら、どの言語がお奨めですか?

初めて関数型言語を学ぶとしたら、どの言語がお奨めですか?
JavaScriptをやっていて、関数型言語に興味を持ちました。

いままで、勉強した言語はC < Java < Python < JavaScriptです。(右側の方が比重・興味が大きい)
現在、Web系志望の学生なので、その辺を踏まえてアドバイスいただけると助かります。

今のところ興味を持ってるのは、Common Lisp/Haskellあたりです。

よろしくお願いします。

Aベストアンサー

C言語が「関数型」?なのか、と言われると多分違うと思うんですけどね。普通は命令型/手続き型に分類されるんじゃないか、と思います。

ちなみに、JavaScriptはSchemeに影響を受けてる言語です。それで言うと、SchemeかCommon Lispがいいんじゃないのかな、とは思いますがね。ただ、あんまり関数型、って感じで書かれている本は少ないと思います。

Web系志望と言う事なんで、Common Lispですと、

ANSI Common Lisp: http://www.pej-hed.jp/washo/288.html
にHTML生成のトピックあり。

実践Comon Lisp: http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=978-4-274-06721-1
にAllegro Serveと言うライブラリを利用したWebプログラミングの例があり。HTML生成の例もあり。
原著のサイトでは、
http://www.gigamonkeys.com/book/practical-web-programming-with-allegroserve.html
http://www.gigamonkeys.com/book/practical-an-html-generation-library-the-interpreter.html
http://www.gigamonkeys.com/book/practical-an-html-generation-library-the-compiler.html
辺り。

プログラミング言語Lisp: http://ascii.asciimw.jp/books/books/detail/4-7561-3926-4.shtml
CL-HTTPと言うライブラリを用いたWebサーバーの説明が載っています。
ただし、本自体はMacintosh用の商用実装、Mac Common Lisp

Mac Common Lisp:
http://www.digitool.com/

を用いたものなんで、注意する必要があります。Macを持ってないならあまりお薦めしません。また、若干古い本ですね。

Haskellの方は良く分かりませんが、Common LispならそれなりにWeb関係の簡単なアプリの書き方も紹介されている、と言う事です。

参考までに。

C言語が「関数型」?なのか、と言われると多分違うと思うんですけどね。普通は命令型/手続き型に分類されるんじゃないか、と思います。

ちなみに、JavaScriptはSchemeに影響を受けてる言語です。それで言うと、SchemeかCommon Lispがいいんじゃないのかな、とは思いますがね。ただ、あんまり関数型、って感じで書かれている本は少ないと思います。

Web系志望と言う事なんで、Common Lispですと、

ANSI Common Lisp: http://www.pej-hed.jp/washo/288.html
にHTML生成のトピックあり。

実践Comon Lisp: http://s...続きを読む

Qファイル変換ソフト実行時エラー"序数 6467 がMFC42.DLLから見つかりませんでした"が表示される

 あるファイル変換ソフトを実行したところ、以下のメッセージが表示され正常終了できませんでした。
 調べたところ、MFC42.DLLは、C:\WINDOWS\system32とファイル変換ソフト・インストールフォルダに存在し、MFC42.DLLを入れ替えようとしたのですが、ファイル使用中となりできませんでした。
 また、WINDOWSのパス設定を、C:\WINDOWS\system32からファイル変換ソフト・インストールフォルダに変更すればと思ったのですが、変更方法がわかりませんでした。
 どなたか、対処方法を教えてください。

"序数 6467 がDLLダイナミックライブラリMFC42.DLLから見つかりませんでした"

Aベストアンサー

> 序数 6467 が~

典型的なDll Hellです。

真・コンピュータ用語辞典 - DLL Hell
http://www.geocities.co.jp/SiliconValley/5634/t82C4_0001.html#2448

> MFC42.DLL

こちらは、色んなアプリケーション(Word, Excel, オンラインソフト…)が使用するファイルです。
うかつに書き換え、削除すると、Windowsは起動しても、アプリケーションが使えなくなります。

> また、WINDOWSのパス設定を、C:\WINDOWS\system32からファイル変換ソフト・インストールフォルダに変更すればと思ったのですが、

同じ理由でこちらも止めた方が良いです。
下手をするとOSさえ起動しなくなるかも。

--
Windows9x/Meであれば、ファイル変換ソフトのフォルダにDLLがある今の状態で問題なかったのですが、Win2000あたりから管理方式が変わってしまいました。
レジストリをいじくると、XPでも9x形式のパス検索を行うように出来たはずですが、方法を失念。

類似の操作として、以下の手順で互換モードで起動してみると、どうでしょう?

Windows アプリケーションの互換モードの使用方法
http://support.microsoft.com/default.aspx?scid=kb;ja;292533

参考URL:http://support.microsoft.com/default.aspx?scid=kb;ja;292533

> 序数 6467 が~

典型的なDll Hellです。

真・コンピュータ用語辞典 - DLL Hell
http://www.geocities.co.jp/SiliconValley/5634/t82C4_0001.html#2448

> MFC42.DLL

こちらは、色んなアプリケーション(Word, Excel, オンラインソフト…)が使用するファイルです。
うかつに書き換え、削除すると、Windowsは起動しても、アプリケーションが使えなくなります。

> また、WINDOWSのパス設定を、C:\WINDOWS\system32からファイル変換ソフト・インストールフォルダに変更すればと思ったのですが、

同...続きを読む

Qこのプログラムは何言語?何のプログラム?

このプログラムは何言語?何のプログラム?
手掛かり的な情報は全く無いのです。

10 CLS:CGSET 1,0
20 DEF SPRITE 0,(0,1,0,0,0)=
CHR$(1)+CHR$(0)+CHR$(3)+CHR$(2)
30 SPRITE ON
40 FOR X=0 TO 240
50 SPRITE 0,X,120
60 PAUSE 3
70 NEXT

Aベストアンサー

補足:
一応正確を記す為に
20 DEF SPRITE 0,(0,1,0,0,0)=CHR$(1)+CHR$(0)+CHR$(3)+CHR$(2)
だと、たてに左右入れ替わった真っ二つ髭親父のスプライトとなります。
ちゃんと表示させると
20 DEF SPRITE 0,(0,1,0,0,0)=CHR$(0)+CHR$(1)+CHR$(2)+CHR$(3)
この順番
「上左+上右+下左+下右」に対応していて
[0][1]
[2][3]
が正常表示なら
[1][0]
[3][2]
が質問者様が提示したイメージとなります。

QDLLファイルを削除してもいい?

『Acrobat Reader4.0』を、アンインストールする時に、『DLLファイルを削除しますか?削除すると、他のアプリケーションが起動しない場合があります』のような内容だったので、削除しないまま、アンインストールしました。そのファイルは、残ったままなんですが・・ファイルは削除してしまうと、どういう時に不都合になるのでしょうか?DLLファイルの意味をよく理解していないので、詳しく教えて下さいませ。よろしくお願いします。m(__)m

Aベストアンサー

DLL(ダイナミックリンクライブラリ)は、プログラムの一部を実行ファイルから切り離して、複数のプログラムから使えるようにしたものです。
つまりそのDLLはAcrobat Reader以外のプログラムも使う可能性がある、ということです。
ただし、アンインストーラが自分以外の共有DLLを削除することは、まず、ありません。
アンインストーラが削除しようとするのは、Acrobatをインストールしたときに一緒に入れられたDLLであり、それを他のプログラムが参照することは普通あまり考えられないからです。

後でDLLを手動で削除するときは、そのDLLファイルの置かれている場所を判断の目安にしてください。

アプリケーション(この場合はAcrobat)と同じフォルダ内にあるDLL→ほとんどの場合は消しても問題ない

WindowsのSYSTEMフォルダにあるDLL→消すと問題が起きるおそれがある

Qc言語 関数の引数に関数?他

初心者でつまずいてます。
ご存知の方教えていただけないでしょうか?
http://developer.apple.com/samplecode/PlayAudioFileLite/PlayAudioFileLite.html
のサンプルソースを見ているのですが

MyFileRenderProc宣言内の
err = AudioConverterFillComplexBuffer(converter, MyACComplexInputProc ,inInputDataProcUserData , &inNumFrames, ioData, outPacketDescription);
のMyACComplexInputProcと

setupCallbacks宣言内の
renderCallback->inputProc = MyFileRenderProc;
のMyFileRenderProc

はどういう状態なのでしょうか?
関数の戻り値が入るような気がするのですが
引数が記述されてないし,,,
よろしくお願いします。

初心者でつまずいてます。
ご存知の方教えていただけないでしょうか?
http://developer.apple.com/samplecode/PlayAudioFileLite/PlayAudioFileLite.html
のサンプルソースを見ているのですが

MyFileRenderProc宣言内の
err = AudioConverterFillComplexBuffer(converter, MyACComplexInputProc ,inInputDataProcUserData , &inNumFrames, ioData, outPacketDescription);
のMyACComplexInputProcと

setupCallbacks宣言内の
renderCallback->inputProc = MyFileRenderProc;
のMyFileRenderProc

...続きを読む

Aベストアンサー

AudioConverterFillComplexBuffer の第2引数プロトタイプ宣言や、renderCallback->inputProc での構造体メンバinputProcの型が書かれてないので確実とはいえませんが、まず間違いなくこれらは関数へのポインタ型変数で、参照されている MyACComplexInputProc や MyFileRenderProcは、関数自体(関数処理プログラムのアドレス)を表していると思います。関数アドレス自体でなく、別の「関数へのポインタ型変数」かもしれません。

下記のプログラムの意味が分かるでしょうか?2行目が関数アドレスの「関数へのポインタ」への代入、4行目が「関数へのポインタ」から「関数へのポインタ」への代入です。
double (*p)(double),(*q)(double);
p=sin; q=cos;
printf("%10.8f\n",(*p)(3.1416/2));
p=q;
printf("%10.8f\n",(*p)(3.1416/2));


人気Q&Aランキング

おすすめ情報