2008-09-02 16 views
2

私は、vb.net 2005からサードパーティベンダのC DLLを呼び出して、P/Invokeエラーを取得しようとしています。私は首尾よく他の方法を呼んでいますが、より複雑なものの一つにボトルネックを打っています。関係する構造は恐ろしいものであり、トラブルシューティングを簡略化するために、問題を再現するためのC++ DLLを作成したいと考えています。.netから呼び出せる非常に単純なC++ DLL

誰かが.Netから呼び出せるC++ DLL用に最小のコードスニペットを提供できますか?自分のC++ DLLに「DLLでXXXという名前のエントリポイントが見つかりません」というエラーが表示されます。解決するのは簡単なはずですが、私はC++プログラマーではありません。

私はあなたのC++関数の宣言に__decspec(dllexport)魔法の妖精の塵を使用してみてください

Declare Function Multiply Lib "C:\MyDll\Debug\MyDLL.DLL" Alias "Multiply" (ByVal ParOne As Integer, ByVal byvalParTwo As Integer) As Integer 

答えて

2

のDLLの.NET宣言を使用したいと思います。この宣言は、DLLから関数を正常にエクスポートするために必要ないくつかの要素を設定します。あなたはまた、WINAPIまたは類似のものを使用する必要がある場合があります

__declspec(dllexport) WINAPI int Multiply(int p1, int p2) 
{ 
    return p1 * p2; 
} 

WINAPIは、そのようなVB.NETなどの言語から呼び出すに適していますような関数呼び出し規約を設定します。

0

(DumpBinまたはDependency Walkerを介して)エクスポートされた関数を見て、名前がマングリングされているかどうかを調べることができます。

0

Gregの提案を使用して、私は以下の作品を見つけました。言及したように、私はC++プログラマーではなく、実用的なものが必要でした。

myclass.cpp の#include "stdafx.hを"

BOOL APIENTRY DllMain(HANDLE hModule, 
         DWORD ul_reason_for_call, 
         LPVOID lpReserved 
       ) 
{ 
    return TRUE; 
} 

int _stdcall multiply(int x , int y) 
{ 
    return x*y; 
} 

myclass.def LIBRARY MyClassの

EXPORTS 

multiply @1 

stdafx.cpp の#include「stdafx。 h "

stdafx.hを

// stdafx.h : include file for standard system include files, 
// or project specific include files that are used frequently, but 
//  are changed infrequently 
// 

#if !defined(AFX_STDAFX_H__5DB9057C_BAE6_48D8_8E38_464F6CB80026__INCLUDED_) 
#define AFX_STDAFX_H__5DB9057C_BAE6_48D8_8E38_464F6CB80026__INCLUDED_ 

#if _MSC_VER > 1000 
#pragma once 
#endif // _MSC_VER > 1000 


// Insert your headers here 
#define WIN32_LEAN_AND_MEAN  // Exclude rarely-used stuff from Windows headers 

#include <windows.h> 


//{{AFX_INSERT_LOCATION}} 
// Microsoft Visual C++ will insert additional declarations immediately before the previous line. 

#endif // !defined(AFX_STDAFX_H__5DB9057C_BAE6_48D8_8E38_464F6CB80026__INCLUDED_) 
関連する問題