- ベストアンサー
DLLでメンバ関数をエクスポートする方法
VC++2005でDLLを作成しています。 そこで、クラスのメンバ関数をエクスポートする必要が出てきました。 クラスのメンバ関数を __declspec(dllexport) を使用せず、 DEFファイルを使用してエクスポートするには、 どのようにしたらよろしいでしょうか。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (3)
- aris-wiz
- ベストアンサー率38% (96/252)
- aris-wiz
- ベストアンサー率38% (96/252)
- Sweet_potato
- ベストアンサー率66% (6/9)
関連するQ&A
- VC++6.0で作成したDLLのクラスをVB6.0でインポートするには?
VC++6.0で作成したDLLのクラスをVB6.0でインポートするにはどうしたらいいのでしょうか? 通常の関数なら__declspec(dllexport) __stdcall を書き,defファイルにEXPORT指定することで解決できたのですが,クラスごとエクスポートする場合にはVC側,VB側の記述をどのようにすれば良いのでしょうか?
- 締切済み
- C・C++・C#
- DLLとインポート、エクスポート
環境 Microsoft Visual C++ DLLはWin32 Dynamic-Link Library ExeはWin32 Application で作成しています。 DLLにメッセージボックスを表示するのみの処理の関数があり。 Exe側でその関数を使用したいだけです。 DLLのヘッダファイルにエクスポートしたい関数を _declspec(dllexport) void exportmain(); としています。 Exeではインポートを __declspec(dllimport) void exportmain(); としています。 プロジェクト⇒設定⇒リンクにlibファイルの設定もしています。 dll、libファイルの場所も問題ないと思います。 しかし、ビルドすると「外部シンボル~~未解決です」とエラーがでてしまいます。なにか原因がわかるかたおりましたら、ご教授お願い致します。
- ベストアンサー
- C・C++・C#
- DLL作成時、defファイルを使いたくない
また質問させて下さい。 Visual Studio2005でDLLを使ったプログラムを作ろうとしています。 defファイルを利用すると、そのDLLファイルを作成できるのですが、 __declspec(dllexport)を利用すると、DLLファイルのその関数を読めなくなってしまいます。 なぜでしょうか? 下記は、MFCで、dll_test7というプロジェクトを作り、そのdll_test7.hのコードのすぐ下に その関数を書きました。(これがダメだと思うのですが…) //●Visual Studioのプロジェクト作成で、生成される部分 // dll_test7.h : dll_test7.DLL のメイン ヘッダー ファイル // #pragma once __declspec(dllexport) void __cdecl test0(void); #ifndef __AFXWIN_H__ #error "PCH に対してこのファイルをインクルードする前に 'stdafx.h' をインクルードしてください" #endif #include "resource.h" // メイン シンボル // Cdll_test7App // このクラスの実装に関しては dll_test7.cpp を参照してください。 // class Cdll_test7App : public CWinApp { public: Cdll_test7App(); // オーバーライド public: virtual BOOL InitInstance(); DECLARE_MESSAGE_MAP() }; //■作成した関数 __declspec(dllexport) void __cdecl test0(void) { CString cs; cs="aa"; ::AfxMessageBox(cs); } 上記は、defファイルを利用するとこの関数を呼び出せます。 以上、どうぞよろしくお願い致します。
- ベストアンサー
- C・C++・C#
- dllエクスポート時のdeclspec(dllexport)について
いつも拝見しています。 さっそくですが質問いたします。 C++の経験が浅いもので言動がおかしい箇所もあるかと思いますが、ご容赦願います。 現在dllを作成してエクスポートを行おうとしています。 エクスポートには__declspec(dllexport)を使用しています。 そこでstd::listの型を定義しているのですがビルドを行うと下記エラーメッセージが警告で発生します。 警告 14 warning C4251: 'XXXXX' : class 'std::list<_Ty>' は __export キーワードを使って class 'YYY' にエクスポートしてください。 d:\module\YYY.h 12 上記メッセージが発生していた場合は外部からdllをロードした際にエラーが発生してしまうものでしょうか? (標準ライブラリのlist定義にも何らかの形で__declspec(dllexport)を指定しなければならないのでは?と勝手に考えています。) また、上記の場合にロードエラーが発生するものだとすれば回避策はあるのでしょうか? 参考になるURL等でも結構ですのでご教授お願い致します。 実行環境 Visual C++ 2005 テストコード #include <list> class _declspec(dllexport) test { private: std::list<char> _configs; ← これがあると警告発生 public: test(void); virtual ~test(void); };
- ベストアンサー
- C・C++・C#
- VC2005のDLLを6.0で呼び出すには
VC 2005 Pro Editionで作ったライブラリ(ヘッダ、lib、dll)を頂きました。 頂いたDLLの形式は定義ファイル.defを使わない形式、declspec(dllexport)を使う形式の方です。 呼び出し側はVC6.0EnterPrize(SDK)を使います。 (諸事情により6.0以上にUPすることは不可能) まず、静的リンクをし、関数を呼び出してみました。 (設定のリンクよりlibをリンクさせ、ヘッダをインクルードして) すると以下のメッセージが出てしまいます。 リンク中... Dialog1.obj : error LNK2001: 外部シンボル ""__declspec(dllimport) void __cdecl Init(unsigned char *,unsigned char *,unsigned char *,unsigned char *)" (__imp_?Init_Card@@YAXPAE000@Z)" は未解決です Debug/CardMake.exe : fatal error LNK1120: 外部参照 1 が未解決です 。 link.exe の実行エラー 色々やってみましたが、このエラーから回避できませんでした。 ヘッダ自体に #ifdef _USRDLL #define DLL_PORT __declspec(dllexport) #else #define DLL_PORT __declspec(dllimport) #endif の宣言があるので、別に特別なことをしなくても、大丈夫そうなのですが、何故か出来ません。 次に動的リンクを行っていました。 するとLoadLibraryでエラーになり、GetLastErrrorで14001(エラーメッセージはつかめず)が返ってきました。 (色々調べたところ定義ファイルがないと動的リンクはできないようですね) というわけでにっちもさっちも行かなくなった状況です。 そこでご質問です。 (1)定義ファイルを使わない形式のライブラリ(暗示的に定義されているもの)はどのように呼び出させばよいでしょうか? (2)2005のライブラリを6.0から呼び出すことは可能ですか? また呼び出す方法は? すいませんがご回答をお願いします。
- ベストアンサー
- C・C++・C#
- DLLでLIBファイルが作成されない
DLLを作るプログラムをしているのですが、どうしてもコンパイル時にLIBファイルが作成されません。 1>warning C4091: '__declspec(dllexport)' : 変数が何も宣言されていないときは、'DDDClass' の左辺を無視します。 と警告が出てしまいます。 私が書いたソースは以下の通りで、クラスとそのメンバをEXPORTしたいのです。ここで、最後のコメントを外して有効にするとLIBファイルが作成されることはわかっています。また、クラスのメンバにEXPORTをつけてもオーバーライトだと怒られてしまいます。 どのようにしたらLIBファイルが作成されるようになるのでしょうか? ■■■stub.h■■■ #ifdef __cplusplus #define EXPORT extern "C" __declspec (dllexport) #else #define EXPORT __declspec (dllexport) #endif typedef int (*HOGEHOGE)(int i); EXPORT class DDDClass{ private: int num; HOGEHOGE c; public: DDDClass(); int CALLBACK counter(); int CALLBACK touroku(int (*b)(int i)); }; ■■■stub.cpp■■■ #include <windows.h> #include "Stub1.h" int WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved){ return true; } EXPORT class DDDClass; DDDClass::DDDClass(){ num =0; c = NULL; } int CALLBACK DDDClass::touroku(int (*b)(int i)){ c = b; return 0; } int CALLBACK DDDClass::counter(){ //c = b; c(num); num++; return 0; } /* EXPORT bool CALLBACK aaaaa(){ return true; } */
- ベストアンサー
- C・C++・C#
- エントリポイントがDLLから見つからない
WIN2000のVC++6.0を使ってWin32DLLを作成して、VBから呼びたいのですが、「エントリ関数がDLLファイル内に見つからない」言われるので、ためしにVCから呼んでみたのですが、表題のようなエラーになります。内容は入門書のサンプル通りに作ってみたのですが・・・ちゃんとEXPORTされていないのでしょうか? [DLL側] <ヘッダファイル> #ifdef XXXX_EXPORTS #define XXXX_API __declspec(dllexport) #else #define XXXX_API __declspec(dllimport) #endif XXXX_API long AddLong(long a, long b); <ソースファイル> XXXX_API long AddLong(long a, long b) { return a + b; } [呼び出し側VC] #include "stdafx.h" #include "XXXX.h" int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { TCHAR s[20]; wsprintf(s,"%d",AddLong(123,456)); MessageBox(NULL,s,"DLLの参照",MB_OK); return 0; } プロジェクトの設定のリンク時のライブラリには XXXX.lib を追加しました。 初めてのDLL作成でよく分かりません。
- 締切済み
- C・C++・C#
- VB6から参照可能なDLLの作成
VB6から参照可能なDLLの作成を参考書をみながらしましたが、上手くいかない為質問させていただきます。 開発環境VC++ 2005 C++ CTEST.dll #include <windows.h> __declspec (dllexport) int __stdcall test(int i) { i = i + 5; return i; } .defファイル LIBRARY "test" DESCRIPTION EXPORTS A 以上でDLLを作成し、VB6側で Private Declare test Lib "CTEST.dll" (ByVal i as integer) で宣言しても「エラー53 ファイルがみつかりません」と表示されます。「参照の追加」から参照しようとしても「このファイルは参照できません。」をエラーがでてしまいます。 直すべき点はどの部分なのでしょうか? ご教示ねがいます。
- ベストアンサー
- C・C++・C#
- DLLについて
現在APIの勉強中なのですが不明な部分が出てきました。 今、単純な音を鳴らす関数beepをDLLファイルにExportするプログラムを作っているのですが、DLLファイルのExportをDEFファイルにて行うようプログラムを行いました。 DEFファイルの内容を以下に示します。 ----beepll.def------ LIBRARY beepdll EXPORTS beep @3 このDEFファイルを用いて作成したbeepdll.dllファイルをDUMPBIN.EXEを使用して中身を見たところ次のように表示されました。 File Type: DLL Section contains the following exports for beepdll.dll 00000000 characteristics 45B09596 time date stamp Fri Jan 19 18:55:34 2007 0.00 version 3 ordinal base 1 number of functions 1 number of names ordinal hint RVA name 3 0 00001000 beep = ?beep@@YGXG@Z (void __stdcall beep(unsigned sho rt)) Summary 1000 .data 1000 .rdata 1000 .reloc 1000 .rsrc 1000 .text これを見ると確かに序数は"3"になっているのですがEXPORT名がbeepになっていないように見えるのですが、これで正常なのでしょうか? 環境は Visual C++.NET 2005です。 DEFファイルはビルド前に、[プロジェクト]→[---のプロパティ]→[構成プロパティ]→[リンカ]→[入力]→[モジュール定義ファイル]にて定義しました。
- ベストアンサー
- C・C++・C#
- DLL関数を使ったプログラム
DLL関数を使ったプログラムを動かしたんですが、ERRORが解決できず 困っています。DLLを作成したのはいいのですが、それをLoadLibraryで読み込もうとしても指定したプロシージャが見つからないというエラーになるようです。使用している環境はVisual Studio.NET2003です。 以下はDLLのソースです。 // plug.c // #include <windows.h> #include <stdio.h> __declspec(dllexport) void CALLBACK TestFunc() { printf("DLLのTestFunc()関数が実行されました。\n"); } これをビルドするとplug.dllとplug.expとplug.libが作成されました。 そしてこれを使用したプログラムが // stab.c // #include <windows.h> #include <stdio.h> typedef void (*TestFunc)(void); void main() { HMODULE hModule; DWORD error; TestFunc funcPointer; hModule = LoadLibrary(TEXT("plug")); error = GetLastError();//error値が127 funcPointer = (TestFunc)GetProcAddress(hModule,TEXT("TestFunc")); funcPointer(); FreeLibrary(hModule); getchar(); } LoadLibrary関数を使用してアプリのメモリ空間にDLLを読み込もうとしているんですが、ここでハンドルが正確に渡されていないみたいなんです。どうしてこうなるのか分かりません。わかる方いらっしゃったらよろしくお願いします。
- ベストアンサー
- C・C++・C#
お礼
具体的なソースコードと参考URLが非常に参考になりました。 問題は解決しました。 ありがとうございます。