【发布时间】:2018-10-24 02:16:17
【问题描述】:
最近,我需要在我的 C# 项目中使用 Delphi DLL,我已经搜索了一些答案,但是一切都失败了。 DLL的名字是modelDLL.dll,需要另外一个DLL文件(我已经把这两个文件放到debug文件夹里了)
德尔福代码
type
TCharStr=array[0..599] of char;
使用Delphi调用DLL可以正常工作(代码如下),但是,我不知道DLL文件中的具体cmets。 Delphi的相关代码如下:
procedure TMainDLLForm.PedBitBtnClick(Sender: TObject);
var
fileName:TCharStr;
begin
OpenDataFileDlg.InitialDir:= GetCurrentDir;
OpenDataFileDlg.Title:='load model file';
OpenDataFileDlg.Filter := 'model_A[*.mdl]|*.mdl|model_T[*.mdr]|*.mdr';
if OpenDataFileDlg.Execute then
begin
StrPCopy(FileName,OpenDataFileDlg.FileName);
tmpD:=NIRSAModelForPred(graphyData,dataLength,FileName,targetName);
end;
if compareText(fileExt,'.MDR')=0 then
begin
memo1.Lines.Add('model_T: '+ExtractFileName(FileName));
memo1.Lines.Add(Format('Result: %10s:%0.0f',[targetName,tmpD]));
end;
memo1.Lines.Add('--------------');
memo1.Lines.Add(trim(NIRSAPretreatInfor(FileName)));// calling this function
memo1.Lines.Add('--------------');
memo1.Lines.Add(trim(NIRSAModelInfor(FileName)));
end;
我的 C# 代码紧随其后,提示“尝试读取或写入受保护的内存。这通常表明其他内存已损坏。”错误。
[MarshalAs(UnmanagedType.LPStr, SizeConst = 600)]
public string fileName;
[DllImport(@"modelDLL.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
[return: MarshalAs(UnmanagedType.LPStr, SizeConst = 600)]
public static extern string NIRSAPretreatInfor(ref string fileName);
private void preCalcButton_Click(object sender, EventArgs e)
{
OpenFileDialog dialog = new OpenFileDialog();
dialog.Multiselect = false;
if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
fileName = dialog.FileName;
string result = NIRSAPretreatInfor(ref fileName);
modelInfoTextBox.Text = result;
}
}
那么,谁能给我一些建议?您的回复将不胜感激!
PS: 德尔福版本:7.0
导入DLL代码:
implementation
function
NIRSAModelForPred(Data:TGraphyData;dataLength:integer;ModelFileName:TCharStr;var targetName:TCharStr):double;stdcall;external 'modelDLL.dll';
function NIRSAModelInfor(ModelFileName:TCharStr):TCharStr;stdCall;external 'modelDLL.dll';
function NIRSAPretreatInfor(ModelFileName:TCharStr):TCharStr;stdCall;external 'modelDLL.dll';
现在我已将CharSet = CharSet.Auto 更改为CharSet = CharSet.Ansi 并再次出现错误消息。
The call to the PInvoke "NIRSAPre!NIRSAPre.Form1::NIRSAPretreatInfor" function causes the stack to be asymmetric.
【问题讨论】:
-
我看不到您在哪里导出 Delphi 方法。查看此链接,它可以让您深入了解您可能想要尝试的内容。 stackoverflow.com/a/38219260/3516555
-
你必须在DLL中显示函数描述(尤其是调用约定)并指定Delphi版本(是Unicode吗?)
-
感谢您的回复,我现在无法告诉您DLL中的功能描述(我稍后会发布)并且Delphi的版本是7。但是DLL的提供者给了我一个简短的功能描述:
-
(使用C): Char NIRSAPretreatInfor (char *ModelFileName); 输入参数: char ModelFileName[600]; / 模型文件名,扩展名*.mdl或*.mdr */ 返回值:array char str [600],描述内容;
-
字符集不是主要问题。我会写一个答案,希望能解释一下。