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

yinbin 2005-09-25 03:25:34
#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();函数的入口点,真是烦,请大侠手解答!

分不够尽管说!
...全文
1091 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
understand999 2005-09-26
  • 打赏
  • 举报
回复
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,实现分页打印预览,出打印对话框打印和直接打印。
shalen520 2005-09-26
  • 打赏
  • 举报
回复
mark
zhangren1218 2005-09-26
  • 打赏
  • 举报
回复
using System.Runtime.InteropServices;

[DllImport("user32.dll")]
public static extern long ExitWindowsEx(long dwOptions, long dwReserved);
rainraid 2005-09-26
  • 打赏
  • 举报
回复
mark
yinbin 2005-09-25
  • 打赏
  • 举报
回复
extern "C" SAMPLEDLL_API int fnSampleDLL(void);

是改C++里面的函数还是改C#里面的定义!
koffighter 2005-09-25
  • 打赏
  • 举报
回复
这是要加 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);
zeusvenus 2005-09-25
  • 打赏
  • 举报
回复
自己手工加载个main入口点不行吗?
可能是export的函数的问题?
-------------------------------
mark
saucer 2005-09-25
  • 打赏
  • 举报
回复
我已经回答过了,先用dumpbin.exe确认你export的函数的名字,dumpbin.exe应该是在VC那个安装目录的BIN目录里


也参考

http://groups.google.com/group/microsoft.public.dotnet.framework.clr/msg/cfc623e00a8f0249?hl=en&
zhaoliang_chen 2005-09-25
  • 打赏
  • 举报
回复
先确定函数名
sanall 2005-09-25
  • 打赏
  • 举报
回复
如果你没有使用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是一些不确定的符号
yinbin 2005-09-25
  • 打赏
  • 举报
回复
在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);
yinbin 2005-09-25
  • 打赏
  • 举报
回复
我运行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,我又不能改!
yinbin 2005-09-25
  • 打赏
  • 举报
回复
关键问题是DLL是别人提供的,我又不能修改!
o0oCm 2005-09-25
  • 打赏
  • 举报
回复
我顶我接分

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧