こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

VisualStudio2005でのDLL作成

開発環境
OS:WindowsXP SP2
SDK:VisualStudio2005 StandardEdition
言語:VC++
Win32コンソールアプリケーションのDLLを選択
空のプロジェクトを使用

作成したいのはVBなどから呼び出せるWin32DLLです。
他のホームページを参考にして以下のようなファイルを作成し
ビルド->コンパイルしたところdllファイルはできましたが
AccessVBAから参照設定ができませんでした。
どこを修正すればよいか教えてください。
<dlltest.cpp>
#define EX __declspec (dllexport)
#include <iostream>
#include <windows.h>
EX int fnWindowHook(void);

BOOL APIENTRY DllMain(
HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call){
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

EX int hundred(){
return 100;
}
<dlltest.def>
LIBRARY"dlltest1"
EXPORTS
disp @1

投稿日時 - 2009-06-26 01:00:34

QNo.5075156

困ってます

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

やるとすれば ATLプロジェクトでしょうね

Win32プロジェクトから作るとなると COM回りもすべて自前で実装
といった大掛かりなものになりそうです

ATLならばCOM周りをライブラリーに任せてしまって
生成するオブジェクトとUIを付け足すだけでそれなりのものが出来るでしょう

VC付属の MSDN(ヘルプ)で
VC++
 リファレンス
  ATL
以下を参照してみてください

投稿日時 - 2009-06-27 00:08:15

お礼

度々回答ありがとうございます。
参照してみます。

投稿日時 - 2009-06-27 00:37:19

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

参照設定 ... 事前バインディング
CreateObject/GetObject ... 遅延バインディング
という違いです
どちらも対象はActiveX(COM)です

遅延バインディングの関数名からも分かるように何かのObjectを生成出来ないとこれらを使うことは出来ません

事前バインディングなら
dim obj as myDLLObject
Set obj = new myDLLObject

遅延バインディングなら
dim obj as Object
Set obj = CreateObject( "myDLLObject.Sample" )
といった具合の使い方になります

# CreateObjectの引数は適当です

投稿日時 - 2009-06-26 12:44:26

補足

大変失礼しました。
参照設定とCreateObjectの違いではなく
参照設定とCreateObjectに対するDLLの作成のしかたの違いが知りたかったのです。
こちらの質問のしかたが悪かったのに「質問の答えにほとんどなっていない」などと言ってしまい、本当にすいません。
ご回答ありがとうございました。

投稿日時 - 2009-06-27 00:34:17

お礼

ActiveXという名の拡張子がDLLということですか?
プロジェクトでは何になるのですか?
VisualStudioで作成可能ですか?

回答はありがたいですが、質問の答えにはほとんどなっていないです。
参照のしかたではなく参照できるものを作りたいのです。

投稿日時 - 2009-06-26 23:45:44

ANo.2

参照設定して使いたいなら ActiveXDLL(またはOCX)を作らないといけないでしょう

単にAccesVBAからDeclareで呼び出すのであればWin32DLLでも出来ます
この際きおつけるのは 関数の呼び出し方式が C/C++用の cdeclではなく stdcallに変更することです
外部への公開はするのは defファイルでかまいませんが
ソースを C++(cpp)で書いているのであれば
公開する関数を extern "C" { } でくくる必要も出てきそうです

投稿日時 - 2009-06-26 05:03:20

お礼

回答ありがとうございます。
ActiveXとDLLの違いが理解しきれていませんでした。
参照設定でもCreateObjectでも同じなんでしょうか?

extern "C"についてはどこかで見ました。
そのときはdefファイルを使うならいらないとあったので
書いていませんでした。加えてみます。

投稿日時 - 2009-06-26 09:11:59

ANo.1

この辺のサイトを参考にActiveX コンポーネントを作成すれば、VBAから呼び出せると思いますよ。
http://msdn.microsoft.com/en-us/library/ms221375.aspx

投稿日時 - 2009-06-26 02:46:50