C#调用DLL居然说找不到函数的入口点,找了很多方法都不成功,请孟子,思归等大侠来解决我非常头疼的总是!

时间:2022-01-28 19:14:39
#ifdef BS2KAPI_EXPORTS
#define BS2KAPI_API __declspec(dllexport)
#else
#define BS2KAPI_API __declspec(dllimport)
#endif

// This class is exported from the bs2kapi.dll
class BS2KAPI_API CBs2kapi {
public:
CBs2kapi(void);
// TODO: add your methods here.
};

extern BS2KAPI_API int nBs2kapi;

BS2KAPI_API int fnBs2kapi(void);

#define BS2KAPIDLL __declspec(dllexport)

BS2KAPIDLL DWORD BS2KAPI_Initlize(void);
BS2KAPIDLL DWORD BS2KAPI_Close(void);
BS2KAPIDLL DWORD BS2KAPI_HaveOneLook(void);
BS2KAPIDLL DWORD PutOneString (BYTE Type, BYTE Addr, BYTE Data3, BYTE Data2, BYTE Data1); 

在C++中没有问题,而在C#中这样调用
[DllImport("bs2kapi.dll")]
private static extern int BS2KAPI_Initlize();
private void button4_Click(object sender, System.EventArgs e)
{
BS2KAPI_Initlize();

}
提示找不到名为BS2KAPI_Initlize();函数的入口点,真是烦,请大侠手解答!

分不够尽管说!

14 个解决方案

#1


我已经回答过了,先用dumpbin.exe确认你export的函数的名字,dumpbin.exe应该是在VC那个安装目录的BIN目录里


也参考

http://groups.google.com/group/microsoft.public.dotnet.framework.clr/msg/cfc623e00a8f0249?hl=en&

#2


自己手工加载个main入口点不行吗?
可能是export的函数的问题?
-------------------------------
mark

#3


这是要加 extern "C"
  这样定义 extern "C" BS2KAPI_API int fnBs2kapi(void);
  注意 C 要大写。

  微软的解释:
——————————————————————————————————
主要注意包含 DllImport 的代码行。此代码行根据参数值通知编译器,使之声明位于 User32.dll 中的函数并将签名中出现的所有字符串(如参数或返回值)视为 Unicode 字符串。如果缺少 EntryPoint 参数,则默认值为函数名。另外,由于 CharSet 参数指定 Unicode,因此公共语言运行库将首先查找称为 MessageBoxW(有 W 是因为 Unicode 规范)的函数。如果运行库未找到此函数,它将根据调用约定查找 MessageBox 以及相应的修饰名。受支持的调用约定只有 __cdecl 和 __stdcall。
当调用用户定义的 DLL 中所包含的函数时,有必要将 extern "C" 添加在 DLL 函数声明之前,如下所示:
// The function declaration in SampleDLL.h file
extern "C" SAMPLEDLL_API int fnSampleDLL(void);

#4


extern "C" SAMPLEDLL_API int fnSampleDLL(void);

是改C++里面的函数还是改C#里面的定义!

#5


我顶我接分

#6


关键问题是DLL是别人提供的,我又不能修改!

#7


我运行E:\Microsoft Visual Studio .NET 2003\Vc7\bin>dumpbin /export c:\bs2kapi.dll
Microsoft (R) COFF/PE Dumper Version 7.10.3077
Copyright (C) Microsoft Corporation.  All rights reserved.

DUMPBIN : warning LNK4044: 无法识别的选项“/export”;已将其忽略

Dump of file c:\bs2kapi.dll

File Type: DLL

  Summary

        5000 .data
        1000 .rdata
        1000 .reloc
        4000 .text
真的是没办法了,查了好多资料,说是要改extern "C"
可是这是别人的DLL,我又不能改!

#8


在VC里面这样调用就成功
#ifdef BS2KAPI_EXPORTS
#define BS2KAPI_API __declspec(dllexport)
#else
#define BS2KAPI_API __declspec(dllimport)
#endif

// This class is exported from the bs2kapi.dll
class BS2KAPI_API CBs2kapi {
public:
CBs2kapi(void);
// TODO: add your methods here.
};

extern BS2KAPI_API int nBs2kapi;

BS2KAPI_API int fnBs2kapi(void);

#define BS2KAPIDLL __declspec(dllexport)

BS2KAPIDLL DWORD BS2KAPI_Initlize(void);
BS2KAPIDLL DWORD BS2KAPI_Close(void);
BS2KAPIDLL DWORD BS2KAPI_HaveOneLook(void);
BS2KAPIDLL DWORD PutOneString (BYTE Type, BYTE Addr, BYTE Data3, BYTE Data2, BYTE Data1); 

#9


如果你没有使用DEF文件,你就在.h中这样声明
extern "C" 
{
BS2KAPIDLL DWORD BS2KAPI_Initlize(void);
BS2KAPIDLL DWORD BS2KAPI_Close(void);
BS2KAPIDLL DWORD BS2KAPI_HaveOneLook(void);
BS2KAPIDLL DWORD PutOneString (BYTE Type, BYTE Addr, BYTE Data3, BYTE Data2, BYTE Data1);
}
这样编译之后dll中的函数才是标准c方式的

不然你可以用dependency看看你原来的dll,生成的函数名是
BS2KAPI_InitializeXXXX();
其中的XXXX是一些不确定的符号

#10


先确定函数名

#11


mark

#12


eprint自定义打印是一个页面套打工具.它直接在IE浏览器中可视化的设计各种复杂的打印模版,
能够解决在IE浏览器中打印各种复杂的中国式报表及票据。详见: http://218.30.103.110:8080/eprint/index.htm


方成eform是web表单,纯BS结构.100%开放源码.可以在 http://218.30.103.110:8080/eform/index.html 在线试用.

联系电话:010-82645151
 详情参见:http://www.fcsoft.com.cn

    webprint是一个基于表格的页面打印解决方案.先将要打印的数据及样式组织到一个HTML的TABLE元素中, 然后将这个TABLE元素传给webprint,实现分页打印预览,出打印对话框打印和直接打印。

#13


mark

#14


using System.Runtime.InteropServices;

[DllImport("user32.dll")]
   public static extern long ExitWindowsEx(long dwOptions, long dwReserved);

#1


我已经回答过了,先用dumpbin.exe确认你export的函数的名字,dumpbin.exe应该是在VC那个安装目录的BIN目录里


也参考

http://groups.google.com/group/microsoft.public.dotnet.framework.clr/msg/cfc623e00a8f0249?hl=en&

#2


自己手工加载个main入口点不行吗?
可能是export的函数的问题?
-------------------------------
mark

#3


这是要加 extern "C"
  这样定义 extern "C" BS2KAPI_API int fnBs2kapi(void);
  注意 C 要大写。

  微软的解释:
——————————————————————————————————
主要注意包含 DllImport 的代码行。此代码行根据参数值通知编译器,使之声明位于 User32.dll 中的函数并将签名中出现的所有字符串(如参数或返回值)视为 Unicode 字符串。如果缺少 EntryPoint 参数,则默认值为函数名。另外,由于 CharSet 参数指定 Unicode,因此公共语言运行库将首先查找称为 MessageBoxW(有 W 是因为 Unicode 规范)的函数。如果运行库未找到此函数,它将根据调用约定查找 MessageBox 以及相应的修饰名。受支持的调用约定只有 __cdecl 和 __stdcall。
当调用用户定义的 DLL 中所包含的函数时,有必要将 extern "C" 添加在 DLL 函数声明之前,如下所示:
// The function declaration in SampleDLL.h file
extern "C" SAMPLEDLL_API int fnSampleDLL(void);

#4


extern "C" SAMPLEDLL_API int fnSampleDLL(void);

是改C++里面的函数还是改C#里面的定义!

#5


我顶我接分

#6


关键问题是DLL是别人提供的,我又不能修改!

#7


我运行E:\Microsoft Visual Studio .NET 2003\Vc7\bin>dumpbin /export c:\bs2kapi.dll
Microsoft (R) COFF/PE Dumper Version 7.10.3077
Copyright (C) Microsoft Corporation.  All rights reserved.

DUMPBIN : warning LNK4044: 无法识别的选项“/export”;已将其忽略

Dump of file c:\bs2kapi.dll

File Type: DLL

  Summary

        5000 .data
        1000 .rdata
        1000 .reloc
        4000 .text
真的是没办法了,查了好多资料,说是要改extern "C"
可是这是别人的DLL,我又不能改!

#8


在VC里面这样调用就成功
#ifdef BS2KAPI_EXPORTS
#define BS2KAPI_API __declspec(dllexport)
#else
#define BS2KAPI_API __declspec(dllimport)
#endif

// This class is exported from the bs2kapi.dll
class BS2KAPI_API CBs2kapi {
public:
CBs2kapi(void);
// TODO: add your methods here.
};

extern BS2KAPI_API int nBs2kapi;

BS2KAPI_API int fnBs2kapi(void);

#define BS2KAPIDLL __declspec(dllexport)

BS2KAPIDLL DWORD BS2KAPI_Initlize(void);
BS2KAPIDLL DWORD BS2KAPI_Close(void);
BS2KAPIDLL DWORD BS2KAPI_HaveOneLook(void);
BS2KAPIDLL DWORD PutOneString (BYTE Type, BYTE Addr, BYTE Data3, BYTE Data2, BYTE Data1); 

#9


如果你没有使用DEF文件,你就在.h中这样声明
extern "C" 
{
BS2KAPIDLL DWORD BS2KAPI_Initlize(void);
BS2KAPIDLL DWORD BS2KAPI_Close(void);
BS2KAPIDLL DWORD BS2KAPI_HaveOneLook(void);
BS2KAPIDLL DWORD PutOneString (BYTE Type, BYTE Addr, BYTE Data3, BYTE Data2, BYTE Data1);
}
这样编译之后dll中的函数才是标准c方式的

不然你可以用dependency看看你原来的dll,生成的函数名是
BS2KAPI_InitializeXXXX();
其中的XXXX是一些不确定的符号

#10


先确定函数名

#11


mark

#12


eprint自定义打印是一个页面套打工具.它直接在IE浏览器中可视化的设计各种复杂的打印模版,
能够解决在IE浏览器中打印各种复杂的中国式报表及票据。详见: http://218.30.103.110:8080/eprint/index.htm


方成eform是web表单,纯BS结构.100%开放源码.可以在 http://218.30.103.110:8080/eform/index.html 在线试用.

联系电话:010-82645151
 详情参见:http://www.fcsoft.com.cn

    webprint是一个基于表格的页面打印解决方案.先将要打印的数据及样式组织到一个HTML的TABLE元素中, 然后将这个TABLE元素传给webprint,实现分页打印预览,出打印对话框打印和直接打印。

#13


mark

#14


using System.Runtime.InteropServices;

[DllImport("user32.dll")]
   public static extern long ExitWindowsEx(long dwOptions, long dwReserved);