• ベストアンサー

c++からdll内の関数を呼ぶ記述方法が知りたいです。

VC++2008 Expressを使っています。 c++からdll内の関数を呼ぶ記述方法が知りたいです。 hoge.dllの関数 int test(int x); c++ ??????????

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

  • ベストアンサー
  • BearCave
  • ベストアンサー率20% (189/909)
回答No.2

手順としてはこんな感じになります。 // 関数の型宣言 typedef int (*PFUNC_TEST)(int); // DLLをロード HINSTANCE hDll = LoadLibrary("hoge.dll"); // 関数へのポインタを取り出す PFUNC_TEST test = (PFUNC_TEST)GetProcAddress(hDll , "test"); // 関数を使う int a = test(5); // 最後にDLLを解放 FreeLibrary(hDll); LoadLibrary関数とGetProcAddress関数は失敗するとNULLを返すので、そのチェックも必要です。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

hoge.dll の関数 int test(int x) はどの言語でコンパイルされたものでしょうか?

関連するQ&A

  • VS2010C#からのDLL使用について

    VS2010 C#からVC6で作成したDLLへint配列を引数として渡したい。 VC++6で作成されたDLLがあります。 ここで定義されている int test(char*fname,int* x,int* y); ファイルのフルパスを渡すと 返り値が関数の成否のコードを返す。 処理内で x,y にファイルから読み込んだ値が それぞれ上限100個としてセットして返す といったような関数を C#から呼び出したいのですが 1 [DllImport("dll名", EntryPoint = "test", CallingConvention = CallingConvention.Cdecl)] public unsafe static extern int test(IntPtr fname, ref int* x,ref int* y); 2 [DllImport("dll名", EntryPoint = "test", CallingConvention = CallingConvention.Cdecl)] public unsafe static extern int test(IntPtr fname, ref IntPtr x,ref IntPtr y); と2種類の呼び出し方法をこころみました。 ファイルのフルパスは IntPtr fnamePtr = Marshal.StringToHGlobalAnsi(string型ファイルフルパス); としております。 1の場合は int[] resX = new int[100]; int[] resY = new int[100]; fixed(int* x= resX) fixed(int* x= resY) として呼び出そうとすると : エラー CS1657: '固定変数' であるため、'x' を ref または out 引数として渡せません となり失敗してしまいます。 2 で試みた場合 int size = sizeof(int)*100; IntPtr x = Marshal.AllocHGlobal(size); IntPtr y = Marshal.AllocHGlobal(size); と引き渡したところ ビルドは通りますが 実行時に System.AccessViolationException' のハンドルされていない例外が 発生しました。 追加情報: 保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。 となってしまいます。 どのようにすれば思惑通りの結果を得られますでしょうか。

  • Cの関数をC++とCのどちらからでも呼べるようにするには?

    お世話になります。 環境はVC6.0となります。 C++で作成したプログラムから、Cで作成したDLLを呼び出す場合、DLL側のプロトタイプ宣言に「extern "C"」を付加する必要があると認識していますが、 呼び出し側がC++かC言語が分からない場合、Cで作成するDLLにはどのように記述するのが一般的(標準的)でしょうか? ちなみに調べてみたところ、 以下のように、「__cplusplus」でくくる方法もあるようですが、C++の標準仕様ではないとの記載がありました。 #ifdef __cplusplus extern "C" { #endif int function(int num); int function2(int num); int function3(int num); #ifdef __cplusplus } #endif よろしくお願いします。

  • C#からDLLの呼び出し方

    visual studio 2008 express edition C#3.5 を使用しています。 http://www.hata.cc/docs/wlinee/1.html を参考にC++からではMySub関数を呼び出すことができたのですが、 C#から呼び出そうと次のように記述したのですが、 [System.Runtime.InteropServices.DllImport("a.dll")] extern int WINAPI MySub(int a, int b); 書き終わったときに、MySubの下に赤線がでて「;が必要です」 というエラーが出てしまいます・・・ たぶん「WINAPI」が認識されてないと思うのですが、 どのように記述すればよいのでしょうか? ~C++での記述~ [dllcall.cpp] #include "stdafx.h" #include <windows.h> #include <conio.h>  // getch( ) を使用するのに必要 extern int WINAPI MySub(int a, int b); int _tmain(int argc, _TCHAR* argv[]) { int c; c=MySub(9, 3); printf("ans=%d\n",c); getch();// キーが押されるまで待つ return 0; } [a.cpp] __declspec(dllexport)int WINAPI MySub(int a, int b) { return a-b; }

  • Cの関数からC++の関数(DLL)を呼ぶ方法について

    C++関数からCの関数を呼ぶには extern "C" を使うのはわかるのですが C関数からC++の関数を呼ぶ方法がわかりません。 『外部参照 1 が未解決』になってリンクが出来ません。 ちなみにC++の関数はDLLで、他のC++関数からは呼ぶことも実行出来ることも 確認済みです。 よろしくお願いします。

  • C#でWin32 MFC DLLが呼び出せない

    C#で以下のエラーが発生し、非常に困ってます。 色々とサイトを見たのですが、DLLが本当にないのでは?という意見が多かったです。 しかし、私の方はDLLファイルはbin->debugフォルダ , obj->debugフォルダ、System32に置いてます。 問題が分かる方、是非教えてください! using System.Runtime.InteropServices; namespace WindowsFormsApplication { public partial class Form1 : Form { [DllImport("Win32DLL_TEST.dll")] private extern static int func(int x, int y); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { int n = func3(5, 7);//ここでエラー! } } } エラー内容 'System.DllNotFoundException' のハンドルされていない例外が WindowsFormsApplication.exe で発生しました。 追加情報: DLL 'Win32DLL_TEST.dll' を読み込めません: 指定されたモジュールが見つかりません。 (HRESULT からの例外: 0x8007007E) 備考 DLLは自作のWin32 DLL です。 extern "C"{ __declspec(dllexport) int __cdecl func(int x, int y) } と宣言し、VC++のMFC dialog上では呼び出しを成功しています。

  • 関数先にて配列の長さを取得する方法

    関数にて、引数にて渡された配列(ポインタ)から配列数を調べる方法はないでしょうか? #include <stdio.h> void test(unsigned int *p){ printf ("%d\n", sizeof(*p)/sizeof(p[0])); //結果 1 } int main(){ unsigned int hoge[] = {0x30, 0x31,0x32}; test(hoge); printf("%d", sizeof(hoge)/sizeof(hoge[0])); //結果3 return 1; } 上記コードの関数testの*pから配列の数3が抜き取りたいと思っております。 よろしくお願いします。

  • VCで作成したDLLの使用

    VCで作成したDLLの使用 VC6.0で作成されたDLLファイルを使いたいのですが _stdcallで記述されたものではなく DllMainで記述されたものなのですが、 VBから呼び出す事は可能でしょうか? 普通にdeclare functionで呼び出そうとすると、 「エントリfnchogeがDLLファイル hoge.dll内に関数が見つかりません。」 とエラーがでるだけでした。 VB6.0SP3 Windows2000

  • [c++]#using "user32.dll"でエラー

    VC++ 2008 Express Editionを使用しています。 ソースコード上に#using "user32.dll"を記述したところ 「 fatal error C1113: #using が 'c:\windows\servicepackfiles\i386\user32.dll' で失敗しました。」というエラーが出てしまいコンパイルできません。#using <mscorlib.dll>を記述した場合はコンパイルできます。 どうしたら#using "user32.dll"を使えるようになりますか?なおuser32.dllはちゃんと存在します。

  • C++で作成したDLLにVBAから配列渡し

    VC++初心者です。よろしくお願いします。 VC++2008ExpressでWindowsアプリケーションのDLLを作成してみました。 Excel2007VBAにて、そのDLLを呼び出して関数を使用したいのですが VBAの配列を参照渡しで渡すと、配列のデータをうまく渡せません。 コードは以下の通りです。 配列ではないデータはうまくいきますが。。。 配列の場合はもっと他に必要なことがあるのでしょうか? よろしくお願いします。 //VC++ DLLコード #include <windows.h> int APIENTRY Add(int[] a) {    return a[0] + a[1] ; } '''VBAのコード Private Declare Function Add Lib "TEST_DLL.dll" (ByRef a() As Integer) As Integer Dim a(1) As Integer Sub test() a(0) = 1 a(1) = 2 MsgBox (Add(a)) End Sub メッセージボックスには3が表示されるはずですが 変な数字に化けてしまいます。 どなたか、ご存知の方、よろしくお願いします。

  • C#でアンマネージドの関数を呼ぶ時のLPBYTEの処理

    C#に首を突っ込み始めたばかりの初心者です。 VC++で使っていた関数をC#から使いたいのですが、四苦八苦しています。 引数としてLPBYTEをとるような関数ですが、C#からどのようにして呼べばいいのか困っています。呼ぶには呼ぶようですが、たぶんLPBYTEの処理がうまくいっていないので、例外処理されてしまいます。 ソースはこんな感じです。(途中、省略しています。) unsafe public class foo : ... { [DllImport("bar.dll")] private static extern int hoge(StringBuilder pBuf, int i); unsafe private void button(...) { StringBuilder pBuf = new StringBuilder(256*256); try { hoge(pBuf, 100); } catch{ ... } } } hogeの最初の引数が、LPBYTEだったところで、StringBuilderならいけるかなぁ、と思ってやってみたのですが、どうもダメっぽいです。おもいっきりcatchに入っていきます。 そもそも、C#でLPBYTEのような領域の扱いがわかっていないのがいけないのかもしれません... 素人の質問ですみません。

専門家に質問してみよう