質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

1回答

2706閲覧

C#から、Windows API HtmlHelp を、コマンド:HH_GET_WIN_TYPE で実行して、HH_WINTYPE 構造体を取得したい

nakanak

総合スコア22

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

1グッド

0クリップ

投稿2020/07/06 08:59

前提・実現したいこと

C#(.NET Framework 4.6.2)から、Windows API HtmlHelp を、コマンド:HH_GET_WIN_TYPE で実行して、HH_WINTYPE 構造体を取得したい

発生している問題・エラーメッセージ

以下のコードを実行後、

var ret = NativeMethods.HtmlHelp(hWndCaller, helpFilePath, command, hWinType);

Win32 SetLastError 関数から、以下エラーメッセージがでて、正常にHH_WINTYPE構造体を取得できません。

122:システム コールに渡されるデータ領域が小さすぎます

該当のソースコード

DllImportの定義

C#

1[DllImport(ExternDll.Hhctrl, SetLastError = true, EntryPoint = HtmlHelpEntryPoint, CharSet = CharSet.Unicode)] 2public static extern int HtmlHelp(HWND hwndCaller, [MarshalAs(UnmanagedType.LPWStr)]string pszFile, HTMLHelpCommand uCommand, [In][Out]HH_WINTYPE dwData);

HTMLHelpCommandの定義

C#

1[Flags()] 2public enum HTMLHelpCommand : uint 3{ 4 HH_DISPLAY_TOPIC = 0x0000, 5 HH_DISPLAY_TOC = 0x0001, 6 HH_DISPLAY_INDEX = 0x0002, 7 HH_DISPLAY_SEARCH = 0x0003, 8 HH_SET_WIN_TYPE = 0x0004, 9 HH_GET_WIN_TYPE = 0x0005, 10 HH_GET_WIN_HANDLE = 0x0006, 11 HH_DISPLAY_TEXT_POPUP = 0x000E, 12 HH_HELP_CONTEXT = 0x000F, 13 HH_CLOSE_ALL = 0x0012, 14 HH_GET_LAST_ERROR = 0x0014, 15 HH_INITIALIZE = 0x001C, 16 HH_UNINITIALIZE = 0x001D, 17 HH_PRETRANSLATEMESSAGE = 0x00FD 18}

HH_WINTYPE の定義

C#

1[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] 2public class HH_WINTYPE 3{ 4 internal int cbStruct = Marshal.SizeOf(typeof(HH_WINTYPE)); 5 internal bool fUniCodeStrings; 6 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] 7 internal string pszType; 8 internal uint fsValidMembers; 9 internal uint fsWinProperties; 10 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] 11 internal string pszCaption; 12 internal uint dwStyles; 13 internal uint dwExStyles; 14 internal Win32.RECT rcWindowPos = Win32.RECT.FromXYWH(-1, -1, -1, -1); 15 internal int nShowState; 16 internal IntPtr hwndHelp; 17 internal IntPtr hwndCaller; 18 internal IntPtr hwndToolBar; 19 internal IntPtr hwndNavigation; 20 internal IntPtr hwndHTML ; 21 internal int iNavWidth; 22 internal Win32.RECT rcHTML = Win32.RECT.FromXYWH(-1, -1, -1, -1); 23 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] 24 internal string pszToc; 25 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] 26 internal string pszIndex; 27 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] 28 internal string pszFile; 29 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] 30 internal string pszHome; 31 internal uint fsToolBarFlags; 32 internal bool fNotExpanded; 33 internal int curNavType; 34 internal int idNotify; 35 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] 36 internal string pszJump1; 37 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] 38 internal string pszJump2; 39 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] 40 internal string pszUrlJump1; 41 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] 42 internal string pszUrlJump2; 43}

HTMLHelp APIの呼び出し

C#

1var command = NativeMethods.HTMLHelpCommand.HH_GET_WIN_TYPE; 2var hWinType = new NativeMethods.HH_WINTYPE(); 3var ret = NativeMethods.HtmlHelp(hWndCaller, helpFilePath, command, hWinType); 4 5var errCode = Marshal.GetLastWin32Error(); 6Debug.Print($"HH_GET_WIN_TYPE errCode: {errCode}");

補足情報(FW/ツールのバージョンなど)

C#(.NET Framework 4.6.2)

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

HH_WINTYPEが間違っているんじゃないでしょうか。

HH_WINTYPE (htmlhelp.h) - Win32 apps | Microsoft Docs
と見比べると、
HH_INFOTYPE *paInfoTypes;int tabpos;
BYTE tabOrder[HH_MAX_TABS + 1];以下のかなり
が違うように思います。

GitHubでHH_WINTYPEを検索し、呼び出しコード付きだった↓をお借りして試したところ取得できました。
AppTesauros/HH1Interop.cs at master · danilozacyac/AppTesauros

cs

1using System; 2using System.Runtime.InteropServices; 3 4namespace Questions275515 5{ 6 class Program 7 { 8 static void Main() 9 { 10 var chm = @"C:\Windows\IME\IMEJP\help\IMJPCL.CHM>main"; 11 var type = new HH1Interop.HH_WINTYPE(); 12 HH1Interop.HtmlHelp_GetWinType(0, chm, ref type); 13 Console.WriteLine(type.pszCaption); // Microsoft IME - プロパティのヘルプ 14 Console.ReadKey(); 15 } 16 } 17 18 // https://github.com/danilozacyac/AppTesauros/blob/master/ControlFramework/Utility/HH1Interop.cs 19 public class HH1Interop 20 { 21 // 省略 22 } 23}

注意
私はP/Invokeをあまりわかっていません。HTML Helpは全くわかっていません^^;

投稿2020/07/07 09:11

編集2023/07/22 08:32
TN8001

総合スコア9317

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nakanak

2020/07/07 09:57

ありがとうございます。確認してみます。
nakanak

2020/07/07 11:48

上記コードを試しましたが、★印の箇所で、System.NullReferenceException がかえります。お心当たりありますでしょうか? IntPtr pwt = new IntPtr(0); uint TeraCommand = 0x0005; int retval = NativeMethods.HtmlHelp_IntPtr_Helper(0, helpFilePath, TeraCommand, ref pwt); var wintype = new NativeMethods.HH_WINTYPE(); ★wintype = (NativeMethods.HH_WINTYPE)Marshal.PtrToStructure(pwt, typeof(NativeMethods.HH_WINTYPE));
TN8001

2020/07/07 12:09

ライセンスが不明なので実コードには使用しないにしろ、一旦回答そのままで試していただけませんか? もしそれで取れれば、あとは違いを探していくだけでしょうから。 あと皆さんに入ってそうな奴で試したつもりですが、 "C:\Windows\IME\IMEJP\help\IMJPCL.CHM" は存在しますか? なければほかのものでもいいと思いますが、 「>main」の部分を付けないと同様の例外が出て、いろいろ試した中でこれで取れたというだけですので、どういう意味か分かっていません。 ほかのCHMだと違うのかどうかもわかりません。
nakanak

2020/07/08 02:14

>ライセンスが不明なので実コードには使用しないにしろ、一旦回答そのままで試していただけませんか? >もしそれで取れれば、あとは違いを探していくだけでしょうから。 git から pull して、ソリューション「AppTesauro09wpf」をビルドしましたが、「タグ 'DataGridControl' は、XML 名前空間 'http://schemas.xceed.com/wpf/xaml/datagrid' にありません。 」が表示され、ビルドが通りません。xceed社の部品を使っているようですから購入手続きをしないと、ビルドが通らないでしょうかね・・・ >「>main」の部分を付けないと同様の例外が出て 確かに、「>main」部分を付けると同様な例外は出なくなりました。ただ、今度は、同じ箇所(★印)「保護されているメモリに読み取りまたは書き込み操作を行おうとしました。」という例外が出ています。HH_WINTYPEの構造体の作りが怪しいのかなと想像しています。 ★wintype = (NativeMethods.HH_WINTYPE)Marshal.PtrToStructure(pwt,typeof(NativeMethods.HH_WINTYPE)); 何か、お心当たりあれば、教えていただければと思います。よろしくお願いいたします。
TN8001

2020/07/08 02:31

いいえ新しいコンソールプロジェクトを作り、回答Program mainと リンクのclass HH1Interopをコピペで貼ってくださいという意味でした。1分の作業です。 手間を取らせてすいません。 "C:\Windows\IME\IMEJP\help\IMJPCL.CHM"はありました?
nakanak

2020/07/08 11:54

>手間を取らせてすいません。 そういうことでしたか、了解いたしました。 >"C:\Windows\IME\IMEJP\help\IMJPCL.CHM"はありました? ございました。また、先ほどのエラーも解消でき、無事 HH_WINTYPE 構造体を取得できました。大変、助かりました。
TN8001

2020/07/08 12:03

よかったです^^ 取れるのが確定すれば、nakanakさんなら注意深く比べれば原因がわかりそうですね。 あと1点、目的のchmでも>mainで行けのでしょうか?
nakanak

2020/07/09 01:18

>あと1点、目的のchmでも>mainで行けのでしょうか? いえ、main ではいけませんでした。chm 毎に設定されている文字列で、その文字列を当てて、構造体を取得できました。
TN8001

2020/07/09 04:38

なるほど勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問