2013-05-02 15 views
6

私はdev C++にDLLを書きました。 DLLの名前は "DllMain.dll"で、2つの関数、HelloWorldShowMeが含まれています。ヘッダファイルには、次のようになります。C++でC++ DLLを呼び出す方法

DLLIMPORT void HelloWorld(); 
DLLIMPORT void ShowMe(); 

とソースファイルは、次のようになります。私は、DLLにコードをコンパイルするとC#からの二つの機能を呼び出す

DLLIMPORT void HelloWorld() 
{ 
    MessageBox (0, "Hello World from DLL!\n", "Hi",MB_ICONINFORMATION); 
} 

DLLIMPORT void ShowMe() 
{ 
MessageBox (0, "How are u?", "Hi", MB_ICONINFORMATION); 
} 

。 C#のコードは次のようになります。

[DllImport("DllMain.dll", CallingConvention = CallingConvention.Cdecl)] 
public static extern void HelloWorld(); 

[DllImport("DllMain.dll", CallingConvention = CallingConvention.Cdecl)] 
public static extern void ShowMe(); 

私はそれがうまく実行され、メッセージボックスをポップアップし、私は関数を呼び出すときShowMeEntryPointNotFoundExceptionが発生した機能「HelloWorldの」と呼んで

。この例外を回避するにはどうすればよいですか?ヘッダーファイルに extern "C"を追加する必要がありますか?

+0

C++コードを投稿できますか? –

+0

呼び出し規約を 'CallingConvention.StdCall'に変更してください。 – Henrik

答えて

7

VS 2012で、次のコードではうまく働いた:

#include <Windows.h> 
extern "C" 
{ 
    __declspec(dllexport) void HelloWorld() 
    { 
     MessageBox (0, L"Hello World from DLL!\n", L"Hi",MB_ICONINFORMATION); 
    } 
    __declspec(dllexport) void ShowMe() 
    { 
     MessageBox (0, L"How are u?", L"Hi", MB_ICONINFORMATION); 
    } 
} 

注:を私はextern "C"を削除した場合、私は例外を取得します。助け

+0

私はコードを変更しました。問題は解決されました。本当にありがとうございます。 – user1333098

+3

C#から関数C++(つまりコードをマングル)を呼び出す方法については、答えません。 –

+0

@ Hi-Angel私は、コードがどのようなものであるのか、C#からどのように呼び出すのか分かりません。あなたが私の答えを完成させたいのであれば、コメントを投稿してください。あなた自身の答えを投稿することもできます。 – atoMerz

1
using System; 
using System.Runtime.InteropServices; 

namespace MyNameSpace 
{ 
    public class MyClass 
    { 
     [DllImport("DllMain.dll", EntryPoint = "HelloWorld")] 
     public static extern void HelloWorld(); 

     [DllImport("DllMain.dll", EntryPoint = "ShowMe")] 
     public static extern void ShowMe(); 
    } 
} 
+1

私はコードを変更しました。問題は解決されました。本当にありがとうございます。 – user1333098

+2

ダイナミックライブラリの "HelloWorld"がマングルされているため、動作しません。 –

1

もの:

  • ます。extern "C" {Hファイルで、ここでは関数宣言は} C++名のエンコーディングを無効にします。 Cそう#関数に C#の宣言

  • でのC宣言やCallingConvention.Cdeclため

  • 使用__stdcall多分文字列型としてBSTR/_bstr_tを使用し、他のVBの型を使用するでしょう。 http://support.microsoft.com/kb/177218/EN-US

  • ダウンロード "のPInvoke相互運用アシスタント" 第三タブ= C# 宣言で.hファイルからhttps://clrinterop.codeplex.com/releases/view/14120 ペースト機能の宣言。 dllファイル名に置き換えてください。

関連する問題