2

vb.net 2005 からサード パーティ ベンダーの C DLL を呼び出そうとすると、P/Invokeエラーが発生します。私は他のメソッドを正常に呼び出していますが、より複雑なメソッドの 1 つでボトルネックにぶつかっています。関連する構造は恐ろしく、トラブルシューティングを簡素化するために、C++ DLL を作成して問題を再現したいと考えています。

誰かが .Net から呼び出すことができる C++ DLL の最小のコード スニペットを提供できますか? Unable to find entry point named XXX in DLLC++ dll でエラーが発生します。簡単に解決できるはずですが、私は C++ プログラマーではありません。

の DLL に .net 宣言を使用したい

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

3 に答える 3

2

C++ 関数宣言で__decspec(dllexport)マジック ピクシー ダストを使用してみてください。この宣言は、DLL から関数を正常にエクスポートするために必要ないくつかのことを設定します。WINAPI などを使用する必要がある場合もあります。

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

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

于 2008-09-02T09:13:31.043 に答える
0

グレッグの提案を使って、私は次の作品を見つけました。前述のように、私は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_)
于 2008-09-04T12:32:49.847 に答える
0

エクスポートされた関数を (DumpBin または Dependency Walker を介して) 調べて、名前が壊れていないかどうかを確認してみてください。

于 2008-09-02T09:46:13.930 に答える