• 全部
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm&WPF
  • C#开发新技术
  • 问答

DLL函数调用出错:未将对象引用设置到对象的实例

yujuncan 2004-10-28 03:42:12
[DllImport("Attend3X.dll",SetLastError = true)]
private static extern int GetRecordEx(
int nPort,int nAddress,long nRecordAddress,ref UInt32 nCardNo,ref DateTime tDateTime,
ref string PBackData,ref int nBackDataLen)

.....

调用时

int nPort = 1;
int nAddress = 1;
long nRecordAddress = 0L;
DateTime tRecordDateTime = new DateTime(DateTime.Now.Year,DateTime.Now.Month,
DateTime.Now.Day);

string sBackData = "";
int nBackDataLen = 0;
int nRet = GetRecordEx(nPort,nAddress,nRecordAddress,ref nCardNo,ref tRecordDateTime,
ref sBackData,ref nBackDataLen)

出错:未将对象引用设置到对象的实例
该动态库其他函数调用正常


动态库为DELPHI所写,
函数声明为

function GetRecordEx(Port,Address:byte;RecordAddress:LongInt;var CardNo:longword;
var DateTime:TDateTime;var PBackData:PChar;var BackDataLen:integer):integer;stdcall;
external 'Attend.dll';
...全文
374 点赞 收藏 25
写回复
25 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Chief007 2005-05-20
将ref改成out看看如何。
回复
wolf223 2005-05-17
DELPHI里的long对应到.net里是int,否则在调用的时候参数传递会出错,应该说是错位了。你说的例子里OpenPort(int nPort)因为只有一个参数,所以不会有问题。
回复
conan19771130 2005-05-17
关注
回复
losthold 2005-05-17
我也出现过类似的问题,在windows2000下使用时没有任何问题
但是程序在winxp下执行时就出现未将对象引用设置到对象实例的问题
回复
losthold 2005-05-17
你是不是在winXP操作系统下出这个问题的?
回复
yujuncan 2004-11-02
up
回复
yujuncan 2004-11-01
还有你为什么用CallingConvention.Cdecl,而不是其他
回复
4uto 2004-10-31
you need to call the function like this:

[DllImport(@"C:\Program Files\SAP Manage\SAP Business One SDK\UI API\Tools\SBOAddonReg.dll", EntryPoint="GetInstallPath", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
private static extern long GetInstallPath([MarshalAs(UnmanagedType.LPArray)] byte[] installDataFile,
[MarshalAs(UnmanagedType.LPArray)] byte[] outStr,
[MarshalAs(UnmanagedType.LPArray)]Int32[] lLen );


In C#, dlls written in C++ are viewed as "unmanaged" code and you need to marshall the data if you require return values from any methods.

To get the installation path, use the routine below:

byte[] bPath = new byte[500];
Int32[] lLen = new Int32[1];
lLen[0] = 20;

//Get the sPath where to install the addon exe
string InstallStrFile = RegDir + @"\SBOAddOnRegData.sld";
byte[] InstallFile = new byte[InstallStrFile.Length];
InstallFile = System.Text.UTF8Encoding.ASCII.GetBytes(InstallStrFile);

long Tmp = GetInstallPath(InstallFile, bPath, lLen);

//convert the byte array back into a useable string - this returns a string with
//the same length as the array. The end of the string contains \0\0\0 characters
string InstallPath = System.Text.Encoding.ASCII.GetString(bPath);

//get the actual size of the string
int i = 0;
for (i = 0; i < bPath.Length; i++)
{
if (bPath == 0)
break;
}

//set the string to a usaable form - this removes all the \0\0 at the end of the string
InstallPath = InstallPath.Substring(0, i);
回复
yujuncan 2004-10-31
非常谢谢4uto的热情讲解,使我明白了许多
我明天测试一下,
我用几点不解
1.为什么我其他的函数调用的时候好像没有这个问题,也没有用(MarshalAs),并且有返回参数(即引参)
2.在你所说的情况下,有没有资料或者麻烦你再讲解一下,C#中的数据类型如何对应UnmanagedType中的类型,
3.if(bPath == 0) 是不是写错了,应为if (bPath[i] == 0)
最后我想说的是我的DLL是用DELPHI写的,和你说的Written in C++会不会有什么区别

以上问题尚请不吝赐教
回复
fellowcheng 2004-10-30
up
回复
yujuncan 2004-10-30
大侠们请出手哎
回复
老实骆驼 2004-10-30
我也遇到类似问题,关注。
回复
yujuncan 2004-10-30
难道就这样没有救了
回复
saiyang0312 2004-10-29
不知道楼主对于调用返回null和空是如何处理的,是否调试过“nRet”是否有值?如果nRet为null系统也报错
回复
yujuncan 2004-10-29
我想可能也是,可是其他语言调用好像没什么问题,包括该动态库的自测试程序显示一切正常
回复
jinbingg 2004-10-29
在delphi里面给同样参数看看有没有问题,看delphi 里面有没有问题
回复
jinbingg 2004-10-29
参数在delphi 是没有问题
回复
yujuncan 2004-10-29
谢谢楼上两位,PORT,ADDRESS这个没有关系,其他DLL函数调用我试过没有任何问题,再说不是引参
至于引用什么的,好像应该没有问题,因为我说过了,这个DLL库有很多函数,其他都正常,
比如OpenPort(int nPort)等等,都可以,就是这个不行(还有一个GetRecord,和这差不多,就是少了后面两个参数,也有这个问题),我在论坛里搜到过类似的问题,可是找不到满意的答案
回复
Uncommon 2004-10-29
是对象不存在或没有实例化吧

楼主添加引用了么?
引用正常么?
copy到本地了么?
回复
cs920 2004-10-29
帮你UP,个人认为应该是实例化的问题。
回复
加载更多回复
相关推荐
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2004-10-28 03:42
社区公告

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