• ベストアンサー

実行時dllを動かしたい

のですがサイトで見つけたdllの作り方を見て 大人気の無償Borland C++5.51を使って //mydll.cpp #include <windows.h> BOOL __stdcall MyBeep() { return MessageBeep(0); } int __stdcall MyMessageBox(LPCTSTR lpszMessage) { return MessageBox(NULL,lpszMessage,"",0); } を bcc32 -WD mydll してmydll.dllを作り //myexe.cpp #include <windows.h> typedef int (__stdcall *pMyFunction)(LPCTSTR); int APIENTRY WinMain(HINSTANCE,HINSTANCE,LPSTR,int) { HINSTANCE hLib; pMyFunction pMyMessageBox; hLib = LoadLibrary("mydll.dll"); if(hLib) { pMyMessageBox=(pMyFunction)GetProcAddress(hLib,"MyMessageBox"); if(pMyMessageBox)(*pMyMessageBox)("HELLO!!"); FreeLibrary(hLib); } return 0; } を bcc32 -W myexe してmyexe.exeを作り myexe.exe したのですがHELLO!!がでません。 どうしたらいいのでしょうか?

  • keyguy
  • お礼率68% (895/1314)

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

  • ベストアンサー
  • gimmick
  • ベストアンサー率49% (134/270)
回答No.2

おそらくmydll.cppの方で extern "C" __declspec(dllexport) int __stdcall MyMessageBox(LPCTSTR lpszMessage) {... のようにすれば表示されると思います。また、 #ifdef __cplusplus #define DLL_EXPORT extern "C" __declspec(dllexport) #else #define DLL_EXPORT __declspec(dllexport) #endif のようなマクロを使うとCとC++で同じように宣言できます。 # どこでエラーになるかくらいは自力で見つけましょう

keyguy
質問者

お礼

ありがとうございます。 #include <windows.h> extern "C" __declspec(dllexport) BOOL __stdcall MyBeep() { return MessageBeep(0); } extern "C" __declspec(dllexport) int __stdcall MyMessageBox(LPCTSTR lpszMessage) { return MessageBox(NULL,lpszMessage,"",0); } とすれば通りました。

その他の回答 (1)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

DLL側 1.C++で作るなら、extern "C"を忘れずに。 2.外部エクスポート宣言はどこ? http://www.borland.co.jp/qanda/cbuilder/c0003194.html 呼び出し側 1.mydll.dllとしか記述していませんが、PATHがとおってるディレクトリまたは、呼び出しもとのEXEと同じ場所にDLLがありますか? 2.LoadLibraryとGetProcAddress、どちらで失敗してますか?戻り値を確認してください。

keyguy
質問者

お礼

ありがとうございます。 1 すべて同じディレクトリです。 コンパイルエラーや実行エラーはすべて解決しています。 2 LoadLibraryは通りGetProcAddressでoutです。

関連するQ&A

  • DLLの関数呼び出しで引数があるとフリーズしてしまう。

    はじめまして、C言語勉強中の初心者です。 現在、DLLに定義されている関数を呼び出すことを試していますが、うまくいかないので質問させて頂きました。 DLLには2つの関数が定義されています。  1.void Hello()  2.void HelloEx(char *pval); 1の関数を呼び出す場合は異常なく終了するのですが、2の関数を呼び出すと、フリーズしてしまいます。 フリーズする原因が分からないので、教えて頂ければと思います。 以下にソースを掲載します。 因みにコンパイラはBCC5.5.1を使用しています。 ***************************************************** DLL(Hello.c) [bcc32 -WD Hello.c] ***************************************************** #include <windows.h> #include <stdio.h> __declspec(dllexport) void CALLBACK Hello(void) { printf("Hello!\n"); } __declspec(dllexport) void CALLBACK HelloEx(char *pVal) { printf("Hello!%s\n", pVal); } ***************************************************** EXE(HelloTest.c)[bcc32 -L HelloTest.c] ***************************************************** #include <windows.h> #include <stdio.h> typedef void (*Hello)(void); typedef void (*HelloEx)(char*); int main(void) { HMODULE hMod; Hello func; HelloEx funcEx; hMod = LoadLibrary( "Hello.dll" ); if(!hMod) return FALSE; func = (Hello)GetProcAddress( hMod, "Hello"); if(!func) return FALSE; funcEx = (HelloEx)GetProcAddress( hMod, "HelloEx"); if(!funcEx) return FALSE; func(); funcEx("World"); FreeLibrary(hMod); return 0; } *********************************************** 以上

  • bcc32 GetProcAddress( )

    mydll.cpp と mymain.cpp でDLL内の関数を使うテストを しようとしたところです。 GetProcAddress( ) が失敗します。 どこを直せばいいか教えてください。 ///////// mydll.cpp #include <windows.h> extern "C" __declspec(dllexport) int MyFunc(int, int); int MyFunc(int a, int b){return( a + b );} ///////// mymain.cpp #include <windows.h> typedef int (*FUNCTYPE)(int, int); LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){  HMODULE hModule;  FUNCTYPE ft;  int i;  switch(msg){  case WM_RBUTTONDOWN:   hModule = LoadLibrary("mydll.dll");   ft = (FUNCTYPE)GetProcAddress(hModule, "MyFunc");   if(ft == NULL){    //GetLastError();   }   i = (*ft)(7, 8);  break;  case WM_DESTROY:   PostQuitMessage(0);  break;  default:   return DefWindowProc(hWnd, msg, wParam, lParam);  }  return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int){  ・・・ } ///////// コンパイル C:\bcc32 -WD mydll C:\bcc32 -W mymain mydll.obj ///////// 実行 LoadLibrary( ) は NULL 以外を返しました。 DLL_PROCESS_ATTACH は確認できました。 GetProcAddress( ) は NULL を返しました。

  • DLLをGetProcAddress()で実行できない。

    dllの操作の練習をしております。以下のソースのどこがおかしいのでしょうか? add.dllの内容は単にa+bの結果をメッセージボックスに表示させるだけの処理です。add.lib(インポートライブラリ)をリンクさせればうまく動きます。 しかし、GetProcAddress()を使って明示的にdllを呼び出そうとすると、コンパイルエラーで ADD(hWnd,5,5); の行に 「int (__stdcall *)(void)' : 実引数が多すぎます。」 となります。このメッセージの意味もわかりません。 以下のソースのどこがおかしいのでしょうか?コンパイラはVC++6.0でOSはWin2000です。 #include<windows.h> void CALLBACK ADD(HWND hwnd,int a, int b); //ウィンドウプロージャ(ここは別に普通) LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp) { switch (msg) { case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hWnd , msg , wp , lp); } int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance , PSTR lpCmdLine , int nCmdShow) { static FARPROC ADD;  //あやしい HWND hWnd; MSG msg; WNDCLASS winc;     //ウィンドウを作る処理 //~(省略)~ /****明示的にdllを呼び出す****/ ADD = GetProcAddress( LoadLibrary(TEXT("add.dll")) , TEXT("ADD")); ADD(hWnd,5,5); /****************************/ while (GetMessage(&msg , NULL , 0 , 0 )) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } お願いします。

  • DLLの明示的な読み込みの方法

    開発環境:WindowsXP sp2 + VisualStudio2005 MSDNやその他のWebページで、DLLの明示的なロードについて勉強しています。 試しに以下のようなコードを書いてみたのですが、コンパイルは通りますが、実行時にDLLが読み込まれているのにもかかわらず、関数のアドレスが取得できません。 ---DLLのコード--- #include <iostream> using namespace std; __declspec(dllexport) void printMessage() { cout<<"printMessage関数が呼ばれた"<<endl; } ---終わり--- コンパイルしたDLLのみをDLLを使用した実行形式がコンパイル後に収納されるフォルダに移動して、以下のコードを書いてコンパイルしました。 ---EXEのコード--- #include <windows.h> #include <iostream> typedef void(*TFUNC)(); int main(void) { HINSTANCE hInstDLL; TFUNC DllFunction; //DLLの読み込み hInstDLL=LoadLibrary(L"dll.dll"); if(hInstDLL==NULL) { std::cout<<"ERROR"<<std::endl; return 0; } //printMessage関数のアドレスを取得 DllFunction=(TFUNC)GetProcAddress(hInstDLL,"printMessage"); //この辺りがおかしいかも知れない //関数の使用 if(DllFunction==NULL) { std::cout<<"ERROR"<<std::endl; FreeLibrary(hInstDLL); return 0; } DllFunction(); //DLLの解放 if(!FreeLibrary(hInstDLL)) return 0; return 0; } ---終わり--- DLLは見つかる物の、どうも上手くいかないようです......原因は何なのでしょうか。

  • CXXXApp::InitInstance内でDLLの呼び出し

    CXXXApp::InitInstance内でDLLの呼び出しをしています。 呼び出すDLLは、MFCの共有DLLで作成しました。 DLLの内容は、単純にダイアログを表示しているだけです。 そこで、問題が発生しています。 DLLを呼び出すと、アクセスバイオレイションで落ちてしまいます。 どうも、ダイアログの親ウインドウが無いのが問題のようです。どうすれば解決するでしょうか? Exe--------------- BOOL CXXXXApp::InitInstance() { HINSTANCE hDll = NULL; int (__stdcall *lpdlg)( ); hDll = ::LoadLibrary("test.dll"); (FARPROC&)lpdlg = ::GetProcAddress(hDll, "dlgtest"); (*lpdlg)( ); ::FreeLibrary(hDll); } DLL内--------------------- AFX_MANAGE_STATE(AfxGetStaticModuleState()); AfxSetResourceHandle(AfxGetResourceHandle()); CTestDlg dlg; dlg.DoModal();

  • DxLibについて質問です

    DxLibを使ったプログラムがコンパイルできません。 下がそのプログラムです #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { if( DxLib_Init() == -1 ) { return -1; } DrawBox(100,100,300,300,GetColor(255,255,255),TRUE); WaitKey(); DxLib_End(); return 0; } http://p.booklog.jp/book/46490/chapter/77396 このサイトに従って、DXライブラリを使うセットアップをしたのですが、 下のようなエラーコードが出てきます。 ■C:\Users\masaki\Desktop\C> bcc32 windows.cpp Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland windows.cpp: 警告 W8022 C:\borland\bcc55\Include\DxDirectX.h 6121: 'D_CTransInPlaceFilter::Transform(D_IMediaSample *)' が仮想関数 'D_CTransformFilter::Transform(D_IMediaSample *,D_IMediaSample *)' を隠蔽する 警告 W8094 C:\borland\bcc55\Include\DxLib.h 100: #pragma comment( <type> [,"string"] ) の使用法に誤りがある 警告 W8094 C:\borland\bcc55\Include\DxLib.h 101: #pragma comment( <type> [,"string"] ) の使用法に誤りがある 警告 W8094 C:\borland\bcc55\Include\DxLib.h 102: #pragma comment( <type> [,"string"] ) の使用法に誤りがある 警告 W8057 windows.cpp 13: パラメータ 'hInstance' は一度も使用されない(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) ) 警告 W8057 windows.cpp 13: パラメータ 'hPrevInstance' は一度も使用されない(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) ) 警告 W8057 windows.cpp 13: パラメータ 'lpCmdLine' は一度も使用されない(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) ) 警告 W8057 windows.cpp 13: パラメータ 'nCmdShow' は一度も使用されない(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) ) Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Fatal: ファイル SHELL32.LIB が開けません shell32.libが開けないとあり、自分でも調べたのですが、自分にはその内容が理解できず、このサイトに質問を投稿しました。 コンパイラは、Borland C++ Compiler 5.5.1 OSは、Windows 7 Ultimate エディタは、CPad for Borland C++ Compiler ver.2.3.1 です。 よろしくお願いします。

  • Visual Windows for BC++ のサンプルプログラムがエラーになる

    Visual Windows for BC++ をインストールした直後に、新しいプロジェクトをwindows型でつくり、サンプルプログラムをビルドしたところ、うまく実行ファイルができ、正常に動作しました。 次に、OpenCVを http://nautilus.cs.miyazaki-u.ac.jp/~yoshi/pukiwiki/index.php を参考にダウンロードして、 インクルードファイルの検索パスに3つ: C:\Program Files\OpenCV\cv\include、C:\Program Files\OpenCV\cxcore\include、C:\Program Files\OpenCV\otherlibs\highgui ライブラリファイルの検索パスに1つ:C:\Program Files\OpenCV\lib を追加しました。 OpenCVのサンプルプログラムをビルドしようとしたのですがエラーになり先に進みません。それどころか、インストール直後にビルドできたサンプルプログラムもエラーが出るようになってしまいました。 エラーが発生したため、brc32.exe を終了します。 となります。 コンパイルも、以下の警告が出るようになってしまいました。 私の設定が悪いのでしょうか、それとも、Visual Windows for BC++では、OpenCVは扱えない ということでしょうか? よろしくお願いします。 Visual Windows for BC++, Copyright (c) 2003-2007 M. Yasue: proj1.exe ビルド実行中..... Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland ..\hello.cpp: 警告 W8060 ..\hello.cpp 30: おそらく不正な代入(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) ) 警告 W8057 ..\hello.cpp 41: パラメータ 'hPrevInstance' は一度も使用されない(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) ) 警告 W8057 ..\hello.cpp 41: パラメータ 'lpCmdLine' は一度も使用されない(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) ) 警告 W8057 ..\hello.cpp 95: パラメータ 'message' は一度も使用されない(関数 __stdcall OnPaint(HWND__ *,unsigned int,unsigned int,long) ) 警告 W8057 ..\hello.cpp 95: パラメータ 'wParam' は一度も使用されない(関数 __stdcall OnPaint(HWND__ *,unsigned int,unsigned int,long) ) 警告 W8004 ..\hello.cpp 130: 'wmEvent' に代入した値は使われていない(関数 __stdcall WndProc(HWND__ *,unsigned int,unsigned int,long) ) 警告 W8057 ..\hello.cpp 183: パラメータ 'lParam' は一度も使用されない(関数 __stdcall About(HWND__ *,unsigned int,unsigned int,long) ) Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland リソースファイルコンパイル・リンク実行中..... Borland Resource Compiler Version 5.40 Copyright (c) 1990, 1999 Inprise Corporation. All rights reserved. 終了.....

  • spawnl

    #include "stdafx.h" #include <process.h> int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // TODO: この位置にコードを記述してください。 _spawnl(_P_WAIT, "chkbook.exe",...); return 0; } 上のようにして、MFCサンプルの ckhbook.exe  (引数はありません。) を呼び出そうとしましたが、上手く動きません。  どのように修正すれば良いのでしょうか?  コンソールプログラムの場合は、 簡単に呼び出せます。  よろしくお願いいたします。

  • lstrcpyが使えない

    #include <dshow.h> としてlstrcpyを加えたコードを bcc32でコンパイルするとエラーが出ます。他にも色々使えない関数が出てきました。 --------------------------------------------- #include <windows.h> #include <dshow.h> int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR lpCmdLine,int nCmdShow){ TCHAR ore[64]; lstrcpy(ore,TEXT("こんにちは")); return 0; } --------------------------------------------- bcc32 -I"C:\Borland\Bcc55\Include" -L"C:\Borland\Bcc55\Lib" -I"C:\Program Files\Microsoft DirectX 9.0 SDK (October 2005)\Include" -L"C:\Program Files\Microsoft DirectX 9.0 SDK (October 2005)\Lib" -I"C:\Program Files\Microsoft Platform SDK\Include" -L"C:\Program Files\Microsoft Platform SDK\Lib" -W test.cpp --------------------------------------------- エラー E2451 test.cpp 7: 未定義のシンボル lstrcpy_instead_use_StringCbCopy_or_St ringCchCopy(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) ) もし解決方をご存知の方がいらっしゃいましたらご教授なにとぞお願い致します。

  • AfxLoadLibrary関数で、DLLのハンドルが取得できない

    はじめまして。 タイトルの通りですが、AfxLoadLibraryを使用して、DLLのハンドルを取得しようとしています。(取得したハンドルでGetProcAddress関数を使用する為) ここで、AfxLoadLibraryの戻り値となる、ハンドルがNULL(0x0000)となってしまい、GetProcAddressによる関数ポインタの設定が行えない状況となっています。 FormatMessage関数とGetLastErrorを使用し、原因を調べたところ、「指定されたモジュールが見つかりません」というメッセージとなりました。 AfxLoadLibraryで指定しているDLLについては、Exeファイルと同じフォルダ内に存在し、かつ、名前についても間違っていません。 試しに、別DLLを、上記NGとなるDLLと同様の名前で作成してみたところ、ハンドルの取得に成功したので、EXE側のコーディングミスという所は考えづらいところです。 お手数ですが、他の原因に心あたりがありましたらご教唆願います。 <コーディング(一部抜粋)> ---------------------------------------------------------------- HINSTANCE m_handle_Aaa; typedef WORD (WINAPI *LPOpenAaa)(); LPOpenAaa lpOpenAaa; BOOL DllLoad(void) { // Load Dll m_handle_Aaa = AfxLoadLibrary("AaaDLL.dll"); if(m_handle_Aaa < (HINSTANCE)HINSTANCE_ERROR) { PutLastError(); // Error Message return FALSE; } // Get Function Pointer lpOpenAaa = (LPOpenAaa)GetProcAddress( m_handle_Aaa, "OpenAaa"); if(lpOpenAaa == NULL) return FALSE; ・ ・ ・ ----------------------------------------------------------------

専門家に質問してみよう