VC++を使っているのでここに書きこまさせて下さい。
ATLを使ってプログラムを組んでいるのですが、わからないことがあります。

まず「ATL COM ウィザード」で雛型を作成しました。
その後「ATLオブジェクトの新規作成」でCFooクラスを「シンプルオブジェクト」を選択して作りました。
そのCFooクラスにIExtractIconを継承させようとしているのですが、うまくいきません。

class ATL_NO_VTABLE CFoo :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CFoo,&CLSID_Foo>,
public IDispatchImpl<IFoo, &IID_IFoo, &LIBID_FOOLib>,
public IExtractIcon
{/* 長いので省略します */};

このようにCFooを宣言しているのですが、

'CComObject<class CFoo>' : 抽象クラスあるいは構造体のオブジェクトが宣言されています。

というエラーが出てしまいます。
どのようにすれば解決できるのでしょうか?
よろしくお願いします。

A 回答 (1件)

エラーの意味はご存知の通りです。


つまり実装していないインターフェイスがあるために、抽象クラスが
抽象クラスのままなのでしょう。
IExtracticonの純粋仮想関数は実装していますでしょうか?
GetIconLocationとExtractの二つを実装してみて下さい。
詳細はMSDNをどうぞ。

この回答への補足

IExtracticonの純粋仮想関数は実装しています。
MSDNも調べましたが該当する項目を発見できませんでした。

補足日時:2001/01/09 15:49
    • good
    • 0

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

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

Qint select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)について

見当違いな質問かもしれませんがお願いします。

複数のソケットを監視する際にselectを使う場合のことですが、
selectの動作と戻り値について疑問があります。

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/select.2.html
ここを参照すると、selectの戻り値は
「更新された 3 つのディスクリプタ集合に含まれているディスクリプタの数 (つまり、 readfds, writefds, exceptfds 中の 1 になっているビットの総数) を返す。」
とあります。
私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識だとreadfds,writefdsが引数として与えられているとしても、
どちらかのfd_setのうち、一つでも動きがあればselect文は
抜けてしまうことになります。とすると、戻り値として
「readfds, writefds, exceptfds 中の 1 になっているビットの総数」
は常に1ということになってしまいます。しかし、総数というからには
複数同時に1になることもあるはずです。

私の認識が間違っているとは思うのですが、どう間違っているのかわかりません。
select文の動きについて詳しく教えていただけないでしょうか。
または良いページがあれば教えてください。

見当違いな質問かもしれませんがお願いします。

複数のソケットを監視する際にselectを使う場合のことですが、
selectの動作と戻り値について疑問があります。

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/select.2.html
ここを参照すると、selectの戻り値は
「更新された 3 つのディスクリプタ集合に含まれているディスクリプタの数 (つまり、 readfds, writefds, exceptfds 中の 1 になっているビットの総数) を返す。」
とあります。
私の中でselectは登録してあるFDのうち、一つでも動きが...続きを読む

Aベストアンサー

>私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識はあっています。
しかし、selectを呼び出す以前にOKになっているFDがあれば、それらは全てビットがONになります。

話しを簡単にする為に、受信のみのソケットを3つ作成したとします。
これらの3つのソケットに向けて相手が電文を送ったとします。
その状態でまだ、こちらはselectを呼び出さずにいます。しばらくしてから、selectを呼び出すと、selectは即座にリターンし、3つのビットが一度にONになっているはずです。
一方、相手が、一切電文を送ってない状態で、selectを呼び出した場合は、何れかのビットがONになればリターンするので、そのときは、貴方が想像しているように
ビットの総数は1になる可能性が高いです。
従って、相手が電文を送る前にselectを呼び出すか、送った後にselectを呼び出すかは、その時のタイミングにより異なります。従って、ビット数の総和が常に1であるとは、考えない方が無難です。(1つのソケットしか使用しない場合は別ですが・・・)

>私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識はあっています。
しかし、selectを呼び出す以前にOKになっているFDがあれば、それらは全てビットがONになります。

話しを簡単にする為に、受信のみのソケットを3つ作成したとします。
これらの3つのソケットに向けて相手が電文を送ったとします。
その状態でまだ、こちらはselectを呼び出さずにいます。しばらくしてから、selectを呼び出すと、selectは即座にリターンし、3つのビ...続きを読む

Q【C++ TR1】tr1::tupleのコンストラクタについて

 こんばんは。今回初めて此方のカテゴリに質問させて頂きます。
 今暇つぶしにtr1::tuple<T1, T2, ..., TN>の中を書いています。

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf

--------------------------------------------------------------
pdfの[6.1.3]より(少し省略しています)
--------------------------------------------------------------
template<T1, T2, ..., TN>
class tuple
{
public:

↓このコンストラクタのP1~PNが、どの様な型に成るのかが不明瞭です。
explicit tuple(P1, P2, ..., PN);

--------------------------------------------------------------

pdfの[6.1.3.1]辺りにP1~PNの事について、書いてはあるのですが・・・今一掴めません。

例えば、

tr1::tuple<char, int, const char(&)[3]>

と書いた場合、コンストラクタのP1, P2, P3はどう言う型になるのでしょうか。
テンプレートメタプログラムが解る方、ご教示お願いします。

 こんばんは。今回初めて此方のカテゴリに質問させて頂きます。
 今暇つぶしにtr1::tuple<T1, T2, ..., TN>の中を書いています。

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf

--------------------------------------------------------------
pdfの[6.1.3]より(少し省略しています)
--------------------------------------------------------------
template<T1, T2, ..., TN>
class tuple
{
public:

↓このコンストラクタのP1~PNが、どの様な型に成るのかが不明瞭...続きを読む

Aベストアンサー

> where Pi is Ti if Ti is a reference type, or const Ti& otherwise.

なので、

tr1::tuple<char, int, const char(&)[3]>

の仮引数の型は、

const char&, const int&, const char(&)[3]

ではないでしょうか?

Q2 ~ 200 の素数 a, b, c (a < b < c) が、b - a = c - b を満たすa,b,cをビット操作を用いて求め、すべてを表示せよ

ちょっと考えてみました。でも、分かりません・・・まず、int型のintvalに200bitを割り当てて、intval=0としたいのですが、どうしたらいいのでしょう??
とりあえず考えてみたプログラムを誰か見て下さい!!お願いします。
#define BYTESIZE 200
#define MAX 200
main()
{
int i,j,intval=0;
for(i=2;i<=MAX/2;i++)
{
if(intval&(1<<(i-1)){}
else for(j=i*2;j<=MAX;j+=i)intval|=(1<<(j-1));
}/*素数を0、それ以外を1に
for(i=2;i<=MAX/2;i++)
for(j=2;j<=(MAX-i)/2;j++)
if((intval&(1<<(i-1))&&(intval&(i+j-1))&&(intval&(1<<(i+2*j-1)))) print("%3d %3d %3d (%3d)\n",i,i+j,i+2*j,j);
}/*三つ子の素数を調べ出力

ちょっと考えてみました。でも、分かりません・・・まず、int型のintvalに200bitを割り当てて、intval=0としたいのですが、どうしたらいいのでしょう??
とりあえず考えてみたプログラムを誰か見て下さい!!お願いします。
#define BYTESIZE 200
#define MAX 200
main()
{
int i,j,intval=0;
for(i=2;i<=MAX/2;i++)
{
if(intval&(1<<(i-1)){}
else for(j=i*2;j<=MAX;j+=i)intval|=(1<<(j-1));
}/*素数を0、それ以外を1に
for(i=2;i<=MAX/2;i++)
for(j=2;j<=(MAX-i)/2;j++)
if((intval&...続きを読む

Aベストアンサー

まずint型は200ビットもありません。通常は32ビットです。
200ビット使いたければint型を7個用意する必要があります。
つまり
int intval[7];
宣言して、
intval[0] 0~31ビット
intval[1] 32~63ビット
intval[2] 64~95ビット
.
.
.
intval[6] 182~200ビット
として使います。

第iビットの情報を取り出すときは
(intval[i>>5]>>(i&31))&1

第iビットを1にするときは
intval[i>>5]|=1<<(i&31);

とすれば良いでしょう。
関数やマクロを用意することをお勧めします。
例えば
int get(int intval[],int i)
{
return (intval[i>>5]>>(i&31))&1;/*0か1が返って来る。*/
}

void on(int intval[],int i)
{
intval[i>>5]|=1<<(i&31);
}

という感じです。

まずint型は200ビットもありません。通常は32ビットです。
200ビット使いたければint型を7個用意する必要があります。
つまり
int intval[7];
宣言して、
intval[0] 0~31ビット
intval[1] 32~63ビット
intval[2] 64~95ビット
.
.
.
intval[6] 182~200ビット
として使います。

第iビットの情報を取り出すときは
(intval[i>>5]>>(i&31))&1

...続きを読む

Q作成したDLLをATL_COM_APPWIZARDで利用する方法について

VC6++のWin32 Dynamic Link LibraryでDLLを作成しました。
DLLはできたのですが、これを利用する方法がわかりません。

ATL COM AppWizardで作成するアプリからDLLのクラスを使いたいのですが、どのようにすれば使えるのでしょうか?

最初のDLL側は
class Test{
Test(){
ShowMessageBox(NULL, "最初のDLL", "呼ばれました", MB_OK);
}
};

というクラスです。

ATL COM Appwizardでは、
どのように記述すれば、DLLのクラスを利用することができるのでしょうか?

Aベストアンサー

DLLを作成しながら利用方法がわからないって、、いったいどうやって
作ったんでしょ^^;^^;

VC6でATLを使うのは、非常にめんどいです。
内容を技術的に把握してないと、まず、つかえません。
また、『DLLのクラスを利用』と記述していますが、
そもそもCOMのDLLはそのような使い方をするものではありません。

普通のCOMでないDLLで、クラスをexportする方法みたいな話ですか?
もう少し具体的な質問でお願いできればと。。

Q自分のIID_IUnKnown取得について

実際自分でも言ってることが正しいものなのか疑問なのですが、よろしくお願いします。

ActiveX+SDKを用いて、HTTPS接続を行いファイルをダウンロードプログラムを組んでいるのですが、
先輩が言うには

呼び出す自身のIID_IUnKnownを取得の仕方を調べることで問題が解決するそうなのですが、いまいちというか、まったく分からない状態です(泣

現在のソースの一部を乗せておきます。
といっても現在ソースが手元にないので記憶からほりおこしてます・・・
QueryInterface(IID_IUnKnown ,※ )

※この部分わすれました

実際、自分でもこんな説明であっているのかなどもわかりません、足りない情報があるなら補足いたします。ちなみにC言語をまだ1ヶ月ほどのレベルです。

どうか、よろしくお願いいたします。

Aベストアンサー

自信はないですが。。。

>result = URLDownloadToFile( punk, szURL, szFileName, 0, NULL);//<-第一引数で取得したポインタをセットしたい

URLDownloadToFileの第5引数をNULL(進行状況を取得しない)にするのでしたら、第1引数もNULLのままで大丈夫だと思います。試してみてはどうでしょうか?


人気Q&Aランキング

おすすめ情報