C#调用dll执行这个会自动退出

迷路的风 2015-11-04 01:42:06
[DllImport("QHD_SmartMC.dll", EntryPoint = "QHD_OpenPort",
CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
static extern int QHD_OpenPort(ref StringBuilder oErrMsg);
[DllImport("QHD_SmartMC.dll", EntryPoint = "QHD_ClosePort",
CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
static extern int QHD_ClosePort(ref StringBuilder oErrMsg);
[DllImport("QHD_SmartMC.dll", EntryPoint = "QHD_ReadCard",
CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
static extern int QHD_ReadCard(ref StringBuilder oInfo, ref StringBuilder oErrMsg);

int __stdcall QHD_OpenPort(char *oErrMsg);
int __stdcall QHD_ClosePort(char *oErrMsg);
int __stdcall QHD_ReadCard(char *oInfo,char *oErrMsg);

执行
private void button1_Click(object sender, EventArgs e)
{
StringBuilder str1 = new StringBuilder(0);
int str2 = QHD_OpenPort(ref str1);
textBox1.Text = str2.ToString();
textBox2.Text += str1.ToString();
}

private void button2_Click(object sender, EventArgs e)
{
StringBuilder str1 = new StringBuilder(0);
int str2 = QHD_ClosePort(ref str1);
textBox1.Text = str2.ToString();
textBox2.Text += str1;
}

private void button3_Click(object sender, EventArgs e)
{
StringBuilder str0 = new StringBuilder(0);
StringBuilder str1 = new StringBuilder(0);
try
{
int str2 = QHD_ReadCard(ref str1,ref str0);
textBox1.Text = str2.ToString();
textBox2.Text += str1.ToString() + str0.ToString();
}
catch
{
textBox1.Text = "err";
}

}

就执行ReadCard 的时候什么也不提示直接退出掉了 怎么回事呀 是不是类型不对 大神帮下忙
...全文
639 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
ymwl1 2018-11-05
  • 打赏
  • 举报
回复
https://blog.csdn.net/feiyang094/article/details/47297809
ymwl1 2018-11-05
  • 打赏
  • 举报
回复
https://blog.csdn.net/feiyang094/article/details/47297809
迷路的风 2015-11-04
  • 打赏
  • 举报
回复
@Poopaye 谢谢大神 成功了
Poopaye 2015-11-04
  • 打赏
  • 举报
回复
CharSet不要用Auto,换成Ansi
Poopaye 2015-11-04
  • 打赏
  • 举报
回复
那就把所有参数(4个char*)全换成StringBuilder,不要ref 传的参数用new StringBuilder(8000);
秋的红果实 2015-11-04
  • 打赏
  • 举报
回复
int test = 1; test = OpenPort(oErrMsg2); test = ReadCard(oInfo,oErrMsg); 没看懂啊
迷路的风 2015-11-04
  • 打赏
  • 举报
回复
@Poopaye C++ 我这么写可以实现读取 请看楼上部分
迷路的风 2015-11-04
  • 打赏
  • 举报
回复
引用 1 楼 shingoscar 的回复:
ref全去掉
#include <iostream> #include <Windows.h> #include <time.h> //#include "stdafx.h" //int __stdcall QHD_OpenPort(char *oErrMsg); //extern "C" int (__stdcall*QHD_OpenPort)(char *oErrMsg); typedef int(__stdcall*QHD_OpenPort)(char *); typedef int(__stdcall*QHD_ReadCard)(char *,char *); using namespace std; int main() { QHD_OpenPort OpenPort; QHD_ReadCard ReadCard; HINSTANCE hdll; hdll=LoadLibrary("QHD_SmartMC.dll"); if(hdll==NULL) { FreeLibrary(hdll); exit(0); } OpenPort=(QHD_OpenPort)GetProcAddress(hdll,"QHD_OpenPort"); ReadCard=(QHD_ReadCard)GetProcAddress(hdll,"QHD_ReadCard"); if(OpenPort==NULL) { FreeLibrary(hdll); exit(0); } char oInfo[8000] = "Info"; char oErrMsg[8000] = "ErrMsg"; char oErrMsg2[8000] = "ErrMsg"; int test = 1; test = OpenPort(oErrMsg2); test = ReadCard(oInfo,oErrMsg); cout<<oInfo<<endl; cout<<oErrMsg<<endl; FreeLibrary(hdll); } 大神 我用C++ 这么写可以正常输出信息 怎么转成C#的
迷路的风 2015-11-04
  • 打赏
  • 举报
回复
引用 8 楼 angel6709 的回复:
看上去没有问题,dll有问题?



#include <iostream>
#include <Windows.h>
#include <time.h>
//#include "stdafx.h"
//int __stdcall QHD_OpenPort(char *oErrMsg);
//extern "C" int (__stdcall*QHD_OpenPort)(char *oErrMsg);
typedef int(__stdcall*QHD_OpenPort)(char *);
typedef int(__stdcall*QHD_ReadCard)(char *,char *);
using namespace std;
int main()
{
QHD_OpenPort OpenPort;
QHD_ReadCard ReadCard;
HINSTANCE hdll;
hdll=LoadLibrary("QHD_SmartMC.dll");
if(hdll==NULL)
{
FreeLibrary(hdll);
exit(0);
}
OpenPort=(QHD_OpenPort)GetProcAddress(hdll,"QHD_OpenPort");
ReadCard=(QHD_ReadCard)GetProcAddress(hdll,"QHD_ReadCard");
if(OpenPort==NULL)
{
FreeLibrary(hdll);
exit(0);
}
char oInfo[8000] = "Info";
char oErrMsg[8000] = "ErrMsg";
char oErrMsg2[8000] = "ErrMsg";

int test = 1;
test = OpenPort(oErrMsg2);
test = ReadCard(oInfo,oErrMsg);

cout<<oInfo<<endl;
cout<<oErrMsg<<endl;

FreeLibrary(hdll);

}

这是我用C++ 调用的可以正常输出 dll没问题 肯定是我C#写的有问题
angel6709 2015-11-04
  • 打赏
  • 举报
回复
看上去没有问题,dll有问题?
Poopaye 2015-11-04
  • 打赏
  • 举报
回复
你有c++版本的示例吗?
迷路的风 2015-11-04
  • 打赏
  • 举报
回复
引用 1 楼 shingoscar 的回复:
ref全去掉
[DllImport("QHD_SmartMC.dll" ,EntryPoint = "QHD_OpenPort",CharSet=CharSet.Auto,CallingConvention = CallingConvention.StdCall) ] extern static int QHD_OpenPort(ref string ch1); [DllImport("QHD_SmartMC.dll", EntryPoint = "QHD_ClosePort", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] extern static int QHD_ClosePort(ref string ch1); [DllImport("QHD_SmartMC.dll", EntryPoint = "QHD_ReadCard", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] extern static int QHD_ReadCard( string info, string err); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { string str2 = "test"; int str1 = QHD_OpenPort(ref str2); this.textBox2.Text = str1.ToString()+str2; } private void button2_Click(object sender, EventArgs e) { string cha1 = "test1"; string cha2 = "test2"; int str2 = QHD_ReadCard( cha1, cha2); this.textBox2.Text = str2.ToString() + cha1.ToString() + cha2.ToString(); } private void button3_Click(object sender, EventArgs e) { string cha1 = "test"; int str2 = QHD_ClosePort(ref cha1); this.textBox2.Text = str2.ToString()+cha1; } 就是 readcard 退出 但是 是读了卡了
迷路的风 2015-11-04
  • 打赏
  • 举报
回复
引用 1 楼 shingoscar 的回复:
ref全去掉
ref全去掉也一样 直接退出 但是读卡器是反映的 显示是读卡完毕以后程序自动关闭了
迷路的风 2015-11-04
  • 打赏
  • 举报
回复
[DllImport("QHD_SmartMC.dll" ,EntryPoint = "QHD_OpenPort",CharSet=CharSet.Auto,CallingConvention = CallingConvention.StdCall) ] extern static int QHD_OpenPort(ref string ch1); [DllImport("QHD_SmartMC.dll", EntryPoint = "QHD_ClosePort", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] extern static int QHD_ClosePort(ref string ch1); [DllImport("QHD_SmartMC.dll", EntryPoint = "QHD_ReadCard", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] extern static int QHD_ReadCard( string info, string err); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { string str2 = "test"; int str1 = QHD_OpenPort(ref str2); this.textBox2.Text = str1.ToString()+str2; } private void button2_Click(object sender, EventArgs e) { string cha1 = "test1"; string cha2 = "test2"; int str2 = QHD_ReadCard( cha1, cha2); this.textBox2.Text = str2.ToString() + cha1.ToString() + cha2.ToString(); } private void button3_Click(object sender, EventArgs e) { string cha1 = "test"; int str2 = QHD_ClosePort(ref cha1); this.textBox2.Text = str2.ToString()+cha1; }
南天空 2015-11-04
  • 打赏
  • 举报
回复
最后一个说的不对,楼主自动忽略
南天空 2015-11-04
  • 打赏
  • 举报
回复
str1空值引用,而且你在不同的操作下面重复定义相同名字的变量,其实不是一个,操作的串口打开和关闭也不是一个。另外怀疑你串口调用函数本身也不对,返回值是int类型的,你用一个stringbuilder类型的去接受是什么意思?
Poopaye 2015-11-04
  • 打赏
  • 举报
回复
ref全去掉

110,574

社区成员

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

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

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