请问一个C#调用dll的问题

asgard 2004-06-24 02:53:19
C#中调用file.dll的传入参数为String型的文件名(全路径)
……
[DllImport("file.dll", CharSet=CharSet.Auto)]
public static extern bool IsCabinet(string strFileFullPath);
……

file.dll中参数是char型指针:
BOOL IsCabinet(char *cabinet_fullpath)
{
……
}
怎么样修改dll文件呢?第一次做dll,请指教!谢谢
...全文
409 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwwsq 2004-06-29
  • 打赏
  • 举报
回复
DllImportAttribute Class:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemRuntimeInteropServicesDllImportAttributeClassTopic.asp

或者
在C#中使用C/C++写的DLL:
http://www.csdn.net/Develop/Read_Article.asp?Id=16233
ThunderLight 2004-06-29
  • 打赏
  • 举报
回复
今天接着顶...
asgard 2004-06-28
  • 打赏
  • 举报
回复
是呀……
ThunderLight 2004-06-26
  • 打赏
  • 举报
回复
继续顶
关注

btw:发现关于DLL方面的咚咚,好像大家没有很明白的呀
asgard 2004-06-25
  • 打赏
  • 举报
回复
ding yi xia
asgard 2004-06-24
  • 打赏
  • 举报
回复
cablib.dll中:
BOOL IsCabinet(LPTSTR lpzCabFileName)
{
……
}
C#中:
[DllImport("d:\\cablib.dll",EntryPoint="IsCabinet")]
public static extern bool IsCabinet(
[MarshalAs(UnmanagedType.LPStr)]
string strFileFullPath);
这样也不对
哪里错了?
ThunderLight 2004-06-24
  • 打赏
  • 举报
回复
今天怎么了又写错了

[DllImport("d:\\file.dll",EntryPoint="IsCabinet")]
public static extern bool IsCabinet([MarshalAs(UnmanagedType.LPArray)] byte[] cabinet_fullpath);

ThunderLight 2004-06-24
  • 打赏
  • 举报
回复
刚才写错了,试试这个
[DllImport("d:\\file.dll",EntryPoint="IsCabinet")]
public static extern bool IsCabinet([MarshalAs(UnmanagedType.LPStr)] string cabinet_fullpath);

或者

[DllImport("d:\\file.dll",EntryPoint="IsCabinet")]
public static extern bool IsCabinet([[MarshalAs(UnmanagedType.LPArray)] byte[] lpBuffer cabinet_fullpath);



试试行不行,我也不是很明白,共同探讨!
ThunderLight 2004-06-24
  • 打赏
  • 举报
回复
[DllImport("d:\\file.dll",EntryPoint="IsCabinet")]
public static extern [MarshalAs(UnmanagedType.LPStr)] string IsCabinet();



试试行不行,我也不是很明白,共同探讨!
daguzhang 2004-06-24
  • 打赏
  • 举报
回复
[DllImport("d:\\file.dll",EntryPoint="IsCabinet")]试试
还有file.dll中:
extern "C" BOOL _stdcall IsCabinet(char *cabinet_fullpath)
{
……
}


asgard 2004-06-24
  • 打赏
  • 举报
回复
C#中:
using System;
using System.Runtime.InteropServices;

public class CABFileAPI
{
[DllImport("file.dll", CharSet=CharSet.Auto)]
public static extern bool IsCabinet(string strFileFullPath);
}

public class IsCABFile
{
public static void Main()
{
CABFileAPI.IsCabinet("c:\cab\myfile.cab");
}
}

file.dll中:
BOOL IsCabinet(char *cabinet_fullpath)
{
……
}

这样对吗?
daguzhang 2004-06-24
  • 打赏
  • 举报
回复
char*对应的是string啊
你是怎么调用的
daguzhang 2004-06-24
  • 打赏
  • 举报
回复
不是的 就是EntryPoint="MyFunction"
/ mydll.cpp : 定义 DLL 的初始化例程。
//

#include "stdafx.h"
#include "mydll.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

//
// 注意!
//
// 如果此 DLL 动态链接到 MFC
// DLL,从此 DLL 导出并
// 调入 MFC 的任何函数在函数的最前面
// 都必须添加 AFX_MANAGE_STATE 宏。
//
// 例如:
//
// extern "C" BOOL PASCAL EXPORT ExportedFunction()
// {
// AFX_MANAGE_STATE(AfxGetStaticModuleState());
// // 此处为普通函数体
// }
//
// 此宏先于任何 MFC 调用
// 出现在每个函数中十分重要。这意味着
// 它必须作为函数中的第一个语句
// 出现,甚至先于所有对象变量声明,
// 这是因为它们的构造函数可能生成 MFC
// DLL 调用。
//
// 有关其他详细信息,
// 请参阅 MFC 技术说明 33 和 58。
//

// CmydllApp

BEGIN_MESSAGE_MAP(CmydllApp, CWinApp)
END_MESSAGE_MAP()


// CmydllApp 构造

CmydllApp::CmydllApp()
{
// TODO: 在此处添加构造代码,
// 将所有重要的初始化放置在 InitInstance 中
}


// 唯一的一个 CmydllApp 对象

CmydllApp theApp;


// CmydllApp 初始化

BOOL CmydllApp::InitInstance()
{
CWinApp::InitInstance();

return TRUE;
}
extern "C" int _stdcall MyFunction(int i)
{
/*CString sMsg;
sMsg.Format("参数 i=%d\n",i);
sMsg=sMsg+::AfxGetAppName();*/
AfxMessageBox("yes!");
return 0;
}
asgard 2004-06-24
  • 打赏
  • 举报
回复
没有,什么是entrypoint,是不是就是dll中的“main()”?
另外,我的问题是上面提到的两者的参数类型不匹配,和entrypoint有关系吗?

daguzhang 2004-06-24
  • 打赏
  • 举报
回复
我的一个很简单的程序
由于你是引入非托管函数
你要把它声明为摸个类的静态外部成员

public class DLL
{
[DllImport("d:\\mydll.dll",EntryPoint="MyFunction")]
public static extern int MyFun(int i);
}

private void Form1_Load(object sender, System.EventArgs e)
{
DLL.MyFun(1);
}
daguzhang 2004-06-24
  • 打赏
  • 举报
回复
你设置了entrypoint了吗

110,532

社区成员

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

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

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