私は、顧客からのAPI記述のDLLとテキストファイルのみを持っています(下記参照)。 DLLに関する詳細はありません。私はDelphiのバージョンなどを知らない。C#コードの文字列[255]型と構造を持つDelphi DLLを使用
私は両方のAPI関数を使用しようとしたが、うまくいかなかった。一般にstring [255](PatientIDとAccessionNo)の最初の2つのパラメータが重要です。そのDLLに文字列を渡す私の試みは、適切な結果を提供しません。私はアプリケーションのGUIでランダムなガベージ値や文字列の一部を参照してください。私はこのサイトのすべての関連する質問を見て、インターネットで検索しましたが、私を助けたものは見つかりませんでした。
OpenStudy機能 - 私はMarshalAsすべての適切な値(以下参照)、のCharSet = CharSet.Ansiと自動で異なる設定を試みました。 管理対象アプリケーションのGUIテキストフィールドにガベージのランダム値が表示されます。
[DllImport("Lib\\RISInterface.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, EntryPoint = "Open_Study", ExactSpelling = false)] static extern internal int OpenStudy( // try to use here and for all string fields [MarshalAs(UnmanagedType.AnsiBStr)] , LPStr, LPTStr, LPWStr, BStr, TBStr, HString string PatientID, string AccessionNo, bool CloseCurrentStudy, bool AddToWindow, int SeriesRows, int SeriesCols, int PresentationMode, bool AutoTile, bool AutoLoad, bool RemoteExam);
OpenStudy1機能 - 私は構造を記入して関数を呼び出します。私は通常の文字列としてPatientIDとAccessionNoを参照しますが、PatientIDは最初の文字を紛失し、AccessionNoは最初の2文字を紛失します。 (:、 "12345" を "QWERTY" をしてご覧ください:送信 "werty"、 "345")
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct TIQStudyAutomation { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)] public string PatientID; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)] public string AccessionNo; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)] public string StudyUID; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)] public string SeriesUID; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)] public string InstanceUID; public bool CloseCurrentStudy; public bool AddToWindow; public int SeriesRows; public int SeriesCols; public int PresentationMode; public bool AutoTile; public bool AutoLoad; public bool RemoteExam; public bool LoadFromAllSources; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)] public string ArchiveName; } [DllImport("Lib\\RISInterface.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, EntryPoint = "Open_Study1", ExactSpelling = false)] static extern internal int OpenStudy1(TIQStudyAutomation automationInfo);
================= APIの説明========================
これらの関数宣言は次のとおりです。 Delphiコードとすべての文字列参照はAnsi文字列です。
function Open_Study(PatientID, AccessionNo: PAnsiChar; CloseCurrentStudy, AddToWindow: Boolean;
SeriesRows, SeriesCols, PresentationMode: Integer;
AutoTile, AutoLoad, RemoteExam: Boolean): Integer; stdcall;
Return
Error Code.
Remarks
The parameters will be packed into a TIQStudyAutomation record and passed to Open_Study1.
//--------------------------------------------------------------------------------------------------
function Open_Study1(AutomationInfo: TIQStudyAutomation): Integer; stdcall;
Return
Error Code.
Parameters
Takes a TIQStudyAutomation record.
//--------------------------------------------------------------------------------------------------
TIQStudyAutomation = record
PatientID, AccessionNo, StudyUID, SeriesUID, InstanceUID: STRING[255];
CloseCurrentStudy, AddToWindow: BOOLEAN;
SeriesRows, SeriesCols, PresentationMode: Integer;
AutoTile, AutoLoad, RemoteExam, LoadFromAllSources : BOOLEAN; ArchiveName: STRING[255];
end;
ヘルプがありますか?
可能重複[DelphiのDLLを使用する方法(PChar型で)C#で](http://stackoverflow.com/questions/5086645/how-to-use-delphi-dllwith-pchar-type-in-c-sharp) –
@ZENsanそれよりも多くの方法があります。 'string [255]'はマーシャリングを行います。 –
David、「文字列[255]はマーシャリングを必要とする」という意味を明確にすることはできますか? – valger