[解決済み】Internet Explorerの拡張機能開発を始めるには?
質問
どなたか、IEの拡張機能を開発した経験のある方で、その知識を共有できる方はいらっしゃいますか?コードサンプルや、良いものへのリンク、プロセスに関するドキュメントなど、何でも構いません。
本当にやりたいのですが、お粗末なドキュメント、お粗末なコード/サンプルコード/その欠如で、巨大な壁にぶつかっています。どんなヘルプやリソースでも、提供していただけると非常にありがたいです。
具体的には、IEの拡張機能内からDOMにアクセス/操作する方法から始めたいと考えています。
EDIT、さらに詳しく。
理想的には、クリックすると外部サイトへのリンクを含むメニューがポップアップするようなツールバーボタンを仕込みたいのです。また、DOMにアクセスし、条件に応じてページにJavaScriptを仕込みたい。
IEの拡張機能で情報を永続化するにはどうしたらよいですか?Firefox/Chrome/ほとんどのモダンブラウザで、あなたは以下を使用します。
window.localStorage
しかし、IE8/IE7では、明らかにそのような選択肢はありません。SQLiteのDBとかでしょうか?ユーザーのPCに.NET4.0がインストールされていることを前提に考えてもいいのでは?
IE9にも対応したものを作りたいので、スパイスIEは使いたくありません。C++で作った方がいいのであれば、そうすればいいので、この質問にもC++タグを追加しました。
どのように解決するのですか?
[UPDATE] この回答を更新して、次のように動作するようにしました。 インターネットエクスプローラー11 での Windows 10 x64 と Visual Studio 2017 コミュニティ . この回答の前のバージョン(Internet Explorer 8、Windows 7 x64、Visual Studio 2010の場合)は、この回答の一番下にあります。
動作するInternet Explorer 11アドオンを作成する
を使っています。 Visual Studio 2017 コミュニティ , C# , .Net フレームワーク 4.6.1 そのため、これらの手順の一部は、あなたにとって若干異なるかもしれません。
必要なのは Visual Studio を管理者として起動します。 を使用してソリューションをビルドし、ビルド後のスクリプトで BHO を登録できるようにします (レジストリへのアクセスが必要です)。
まず、クラスライブラリを作成します。 私は インターネットエクスプローラーエクステンション .
これらのリファレンスをプロジェクトに追加します。
-
Interop.SHDocVw: COMタブ/検索
"Microsoft Internet Controls"
-
マイクロソフト.mshtml: アセンブリ] タブ / 検索
"Microsoft.mshtml"
注 リファレンスの追加ウィンドウで見つけても、なぜかMSHTMLは私のシステムには登録されていませんでした。そのため、ビルド時にエラーが発生しました。
タイプライブラリ "MSHTML" 用のラッパーアセンブリが見つかりません。
修正版は以下のサイトにあります。 http://techninotes.blogspot.com/2016/08/fixing-cannot-find-wrapper-assembly-for.html または、このバッチスクリプトを実行してください。
"%ProgramFiles(x86)%\Microsoft Visual Studio\2017\Community\Common7\Tools\VsDevCmd.bat"
cd "%ProgramFiles(x86)%\Microsoft Visual Studio\2017\Community\Common7\IDE\PublicAssemblies"
regasm Microsoft.mshtml.dll
gacutil /i Microsoft.mshtml.dll
以下のファイルを作成します。
IEAddon.cs
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using Microsoft.Win32;
using mshtml;
using SHDocVw;
namespace InternetExplorerExtension
{
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[Guid("D40C654D-7C51-4EB3-95B2-1E23905C2A2D")]
[ProgId("MyBHO.WordHighlighter")]
public class WordHighlighterBHO : IObjectWithSite, IOleCommandTarget
{
const string DefaultTextToHighlight = "browser";
IWebBrowser2 browser;
private object site;
#region Highlight Text
void OnDocumentComplete(object pDisp, ref object URL)
{
try
{
// @Eric Stob: Thanks for this hint!
// This was used to prevent this method being executed more than once in IE8... but now it seems to not work anymore.
//if (pDisp != this.site)
// return;
var document2 = browser.Document as IHTMLDocument2;
var document3 = browser.Document as IHTMLDocument3;
var window = document2.parentWindow;
window.execScript(@"function FncAddedByAddon() { alert('Message added by addon.'); }");
Queue<IHTMLDOMNode> queue = new Queue<IHTMLDOMNode>();
foreach (IHTMLDOMNode eachChild in document3.childNodes)
queue.Enqueue(eachChild);
while (queue.Count > 0)
{
// replacing desired text with a highlighted version of it
var domNode = queue.Dequeue();
var textNode = domNode as IHTMLDOMTextNode;
if (textNode != null)
{
if (textNode.data.Contains(TextToHighlight))
{
var newText = textNode.data.Replace(TextToHighlight, "<span style='background-color: yellow; cursor: hand;' onclick='javascript:FncAddedByAddon()' title='Click to open script based alert window.'>" + TextToHighlight + "</span>");
var newNode = document2.createElement("span");
newNode.innerHTML = newText;
domNode.replaceNode((IHTMLDOMNode)newNode);
}
}
else
{
// adding children to collection
var x = (IHTMLDOMChildrenCollection)(domNode.childNodes);
foreach (IHTMLDOMNode eachChild in x)
{
if (eachChild is mshtml.IHTMLScriptElement)
continue;
if (eachChild is mshtml.IHTMLStyleElement)
continue;
queue.Enqueue(eachChild);
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
#endregion
#region Load and Save Data
static string TextToHighlight = DefaultTextToHighlight;
public static string RegData = "Software\\MyIEExtension";
[DllImport("ieframe.dll")]
public static extern int IEGetWriteableHKCU(ref IntPtr phKey);
private static void SaveOptions()
{
// In IE 7,8,9,(desktop)10 tabs run in Protected Mode
// which prohibits writes to HKLM, HKCU.
// Must ask IE for "Writable" registry section pointer
// which will be something like HKU/S-1-7***/Software/AppDataLow/
// In "metro" IE 10 mode, tabs run in "Enhanced Protected Mode"
// where BHOs are not allowed to run, except in edge cases.
// see http://blogs.msdn.com/b/ieinternals/archive/2012/03/23/understanding-ie10-enhanced-protected-mode-network-security-addons-cookies-metro-desktop.aspx
IntPtr phKey = new IntPtr();
var answer = IEGetWriteableHKCU(ref phKey);
RegistryKey writeable_registry = RegistryKey.FromHandle(
new Microsoft.Win32.SafeHandles.SafeRegistryHandle(phKey, true)
);
RegistryKey registryKey = writeable_registry.OpenSubKey(RegData, true);
if (registryKey == null)
registryKey = writeable_registry.CreateSubKey(RegData);
registryKey.SetValue("Data", TextToHighlight);
writeable_registry.Close();
}
private static void LoadOptions()
{
// In IE 7,8,9,(desktop)10 tabs run in Protected Mode
// which prohibits writes to HKLM, HKCU.
// Must ask IE for "Writable" registry section pointer
// which will be something like HKU/S-1-7***/Software/AppDataLow/
// In "metro" IE 10 mode, tabs run in "Enhanced Protected Mode"
// where BHOs are not allowed to run, except in edge cases.
// see http://blogs.msdn.com/b/ieinternals/archive/2012/03/23/understanding-ie10-enhanced-protected-mode-network-security-addons-cookies-metro-desktop.aspx
IntPtr phKey = new IntPtr();
var answer = IEGetWriteableHKCU(ref phKey);
RegistryKey writeable_registry = RegistryKey.FromHandle(
new Microsoft.Win32.SafeHandles.SafeRegistryHandle(phKey, true)
);
RegistryKey registryKey = writeable_registry.OpenSubKey(RegData, true);
if (registryKey == null)
registryKey = writeable_registry.CreateSubKey(RegData);
registryKey.SetValue("Data", TextToHighlight);
if (registryKey == null)
{
TextToHighlight = DefaultTextToHighlight;
}
else
{
TextToHighlight = (string)registryKey.GetValue("Data");
}
writeable_registry.Close();
}
#endregion
[Guid("6D5140C1-7436-11CE-8034-00AA006009FA")]
[InterfaceType(1)]
public interface IServiceProvider
{
int QueryService(ref Guid guidService, ref Guid riid, out IntPtr ppvObject);
}
#region Implementation of IObjectWithSite
int IObjectWithSite.SetSite(object site)
{
this.site = site;
if (site != null)
{
LoadOptions();
var serviceProv = (IServiceProvider)this.site;
var guidIWebBrowserApp = Marshal.GenerateGuidForType(typeof(IWebBrowserApp)); // new Guid("0002DF05-0000-0000-C000-000000000046");
var guidIWebBrowser2 = Marshal.GenerateGuidForType(typeof(IWebBrowser2)); // new Guid("D30C1661-CDAF-11D0-8A3E-00C04FC9E26E");
IntPtr intPtr;
serviceProv.QueryService(ref guidIWebBrowserApp, ref guidIWebBrowser2, out intPtr);
browser = (IWebBrowser2)Marshal.GetObjectForIUnknown(intPtr);
((DWebBrowserEvents2_Event)browser).DocumentComplete +=
new DWebBrowserEvents2_DocumentCompleteEventHandler(this.OnDocumentComplete);
}
else
{
((DWebBrowserEvents2_Event)browser).DocumentComplete -=
new DWebBrowserEvents2_DocumentCompleteEventHandler(this.OnDocumentComplete);
browser = null;
}
return 0;
}
int IObjectWithSite.GetSite(ref Guid guid, out IntPtr ppvSite)
{
IntPtr punk = Marshal.GetIUnknownForObject(browser);
int hr = Marshal.QueryInterface(punk, ref guid, out ppvSite);
Marshal.Release(punk);
return hr;
}
#endregion
#region Implementation of IOleCommandTarget
int IOleCommandTarget.QueryStatus(IntPtr pguidCmdGroup, uint cCmds, ref OLECMD prgCmds, IntPtr pCmdText)
{
return 0;
}
int IOleCommandTarget.Exec(IntPtr pguidCmdGroup, uint nCmdID, uint nCmdexecopt, IntPtr pvaIn, IntPtr pvaOut)
{
try
{
// Accessing the document from the command-bar.
var document = browser.Document as IHTMLDocument2;
var window = document.parentWindow;
var result = window.execScript(@"alert('You will now be allowed to configure the text to highlight...');");
var form = new HighlighterOptionsForm();
form.InputText = TextToHighlight;
if (form.ShowDialog() != DialogResult.Cancel)
{
TextToHighlight = form.InputText;
SaveOptions();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
return 0;
}
#endregion
#region Registering with regasm
public static string RegBHO = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Browser Helper Objects";
public static string RegCmd = "Software\\Microsoft\\Internet Explorer\\Extensions";
[ComRegisterFunction]
public static void RegisterBHO(Type type)
{
string guid = type.GUID.ToString("B");
// BHO
{
RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(RegBHO, true);
if (registryKey == null)
registryKey = Registry.LocalMachine.CreateSubKey(RegBHO);
RegistryKey key = registryKey.OpenSubKey(guid);
if (key == null)
key = registryKey.CreateSubKey(guid);
key.SetValue("Alright", 1);
registryKey.Close();
key.Close();
}
// Command
{
RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(RegCmd, true);
if (registryKey == null)
registryKey = Registry.LocalMachine.CreateSubKey(RegCmd);
RegistryKey key = registryKey.OpenSubKey(guid);
if (key == null)
key = registryKey.CreateSubKey(guid);
key.SetValue("ButtonText", "Highlighter options");
key.SetValue("CLSID", "{1FBA04EE-3024-11d2-8F1F-0000F87ABD16}");
key.SetValue("ClsidExtension", guid);
key.SetValue("Icon", "");
key.SetValue("HotIcon", "");
key.SetValue("Default Visible", "Yes");
key.SetValue("MenuText", "&Highlighter options");
key.SetValue("ToolTip", "Highlighter options");
//key.SetValue("KeyPath", "no");
registryKey.Close();
key.Close();
}
}
[ComUnregisterFunction]
public static void UnregisterBHO(Type type)
{
string guid = type.GUID.ToString("B");
// BHO
{
RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(RegBHO, true);
if (registryKey != null)
registryKey.DeleteSubKey(guid, false);
}
// Command
{
RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(RegCmd, true);
if (registryKey != null)
registryKey.DeleteSubKey(guid, false);
}
}
#endregion
}
}
インターロップ.cs
using System;
using System.Runtime.InteropServices;
namespace InternetExplorerExtension
{
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("FC4801A3-2BA9-11CF-A229-00AA003D7352")]
public interface IObjectWithSite
{
[PreserveSig]
int SetSite([MarshalAs(UnmanagedType.IUnknown)]object site);
[PreserveSig]
int GetSite(ref Guid guid, [MarshalAs(UnmanagedType.IUnknown)]out IntPtr ppvSite);
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct OLECMDTEXT
{
public uint cmdtextf;
public uint cwActual;
public uint cwBuf;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
public char rgwz;
}
[StructLayout(LayoutKind.Sequential)]
public struct OLECMD
{
public uint cmdID;
public uint cmdf;
}
[ComImport(), ComVisible(true),
Guid("B722BCCB-4E68-101B-A2BC-00AA00404770"),
InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
public interface IOleCommandTarget
{
[return: MarshalAs(UnmanagedType.I4)]
[PreserveSig]
int QueryStatus(
[In] IntPtr pguidCmdGroup,
[In, MarshalAs(UnmanagedType.U4)] uint cCmds,
[In, Out, MarshalAs(UnmanagedType.Struct)] ref OLECMD prgCmds,
//This parameter must be IntPtr, as it can be null
[In, Out] IntPtr pCmdText);
[return: MarshalAs(UnmanagedType.I4)]
[PreserveSig]
int Exec(
//[In] ref Guid pguidCmdGroup,
//have to be IntPtr, since null values are unacceptable
//and null is used as default group!
[In] IntPtr pguidCmdGroup,
[In, MarshalAs(UnmanagedType.U4)] uint nCmdID,
[In, MarshalAs(UnmanagedType.U4)] uint nCmdexecopt,
[In] IntPtr pvaIn,
[In, Out] IntPtr pvaOut);
}
}
そして最後に、オプションの設定に使用するフォームを作成します。このフォームには
TextBox
とOk
Button
. を設定します。
DialogResult
に変更します。
OK
. このコードをフォームのコードに配置します。
using System.Windows.Forms;
namespace InternetExplorerExtension
{
public partial class HighlighterOptionsForm : Form
{
public HighlighterOptionsForm()
{
InitializeComponent();
}
public string InputText
{
get { return this.textBox1.Text; }
set { this.textBox1.Text = value; }
}
}
}
プロジェクトのプロパティで、次のようにします。
- アセンブリにstrong-keyで署名する。
-
デバッグ]タブで
外部プログラムの起動
に変更します。
C:\Program Files (x86)\Internet Explorer\iexplore.exe
-
デバッグ]タブで
コマンドライン引数
から
http://msdn.microsoft.com/en-us/library/ms976373.aspx#bho_getintouch
-
ビルドイベント]タブで ビルド後のイベントのコマンドライン にします。
"%ProgramFiles(x86)%Microsoft SDKsWindowsv10.0AbinNETFX 4.6.1 Toolsgacutil.exe" /f /i "$(TargetDir)$(TargetFileName)".NetFX 4.6.1 Toolsgacutil.exe ".NetFX 4.0.1 ToolsGet! "%windir%Microsoft.NET.FrameWorks\v4.0.30319RegAsm.exe" /unregister "$(TargetDir)$(TargetFileName)"./windir%Microsoft.NETFrameWorks ↘v4.0.30319TargetFileName" "%windir%Microsoft.NET.FrameworkRegAsm.exe" "$(TargetDir)$(TargetFileName)"./windir%Microsoft.NET.FrameworkRegAsm.exe" "$(TargetFileName)
注意
私のPCはx64ですが、x64以外のパスで
gacutil.exe
で、うまくいきました...x64に特化したものは、にあります。
C:♪Program Files (x86)♪Microsoft SDKs ♪Windows v10.0Abin ♪NETFX 4.6.1 Tools x64\ gacutil.exe
64ビットIE 64bitコンパイル、64bit登録されたBHOが必要です。32bitのIE11でしかデバッグできませんでしたが、32bitで登録した拡張機能も64bitのIE11を起動することで動作するようになりました。
この回答には、この件に関する追加情報があるようです。 https://stackoverflow.com/a/23004613/195417
必要であれば、64bitのregasmを使用することができます。
%windir%Microsoft.NETFramework 64\ v4.0.30319\RegAsm.exe
このアドオンの仕組み
アドオンの動作は変更していません。以下のIE8のセクションを参照してください。
## IE8 に対する前回の回答
これは大変な作業だった! どうすればいいのか気になって、自分でやってしまいました。
まず最初に...クレジットはすべて私のものではありません。これは、私がこれらのサイトで見つけたものを編集したものです。
- CodeProjectの記事 BHOの作り方。
- 15秒 が、15秒ではなく、約7時間かかりました。
- マイクロソフトチュートリアル コマンドボタンを追加するのに役立ちました。
- そして、このsocial.msdnのトピック そのおかげで、アセンブリがGACになければならないことがわかりました。
- このMSDNブログの記事 は、完全に動作するサンプルを含んでいます。
- 他の多くのサイト、発見中...
もちろん、質問された機能を持った答えにしたかったしね。
- 何かを探すためのDOMトラバーサル。
- ウィンドウを表示するボタン(私の場合はセットアップ)。
- 設定を保持する (レジストリを使用します)
- で、最後にjavascriptを実行します。
を使用して、どのようにそれを行うことができたか、順を追って説明します。 インターネットエクスプローラー8 での Windows 7 x64 ...他の構成でのテストはできませんでしたので、ご注意ください。ご理解いただけると幸いです =)
動作するInternet Explorer 8アドオンを作成する
を使っています。 ビジュアルスタジオ2010 , C# 4 , .Netフレームワーク4 そのため、これらの手順のいくつかは、あなたにとって若干異なるかもしれません。
クラスライブラリを作成。私の場合は インターネットエクスプローラーエクステンション .
これらのリファレンスをプロジェクトに追加します。
- インターロップ.SHDocVw
- マイクロソフト.mshtml
注:これらの参照先は、各コンピューターで異なる場所にある可能性があります。
csprojのreferencesセクションにはこのように書かれています。
<Reference Include="Interop.SHDocVw, Version=1.1.0.0, Culture=neutral, PublicKeyToken=90ba9c70f846762e, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<EmbedInteropTypes>True</EmbedInteropTypes>
<HintPath>C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\PrivateAssemblies\Interop.SHDocVw.dll</HintPath>
</Reference>
<Reference Include="Microsoft.CSharp" />
<Reference Include="Microsoft.mshtml, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<EmbedInteropTypes>True</EmbedInteropTypes>
</Reference>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
更新されたIE11のファイルと同じ方法でファイルを作成します。
IEAddon.cs
IE11版では、以下の行をアンコメントすることができます。
...
// @Eric Stob: Thanks for this hint!
// This was used to prevent this method being executed more than once in IE8... but now it seems to not work anymore.
if (pDisp != this.site)
return;
...
インターロップ.cs
IE11版と同じです。
そして最後に、オプションを設定するために使用するフォームです。このフォームには
TextBox
とOk
Button
. を設定します。
DialogResult
に変更します。
OK
. IE11アドオンでもコードは同じです。
プロジェクトのプロパティで、以下を実行します。
- アセンブリにstrong-keyで署名する。
-
デバッグ]タブで
外部プログラムの起動
に変更します。
C:\Program Files (x86)\Internet Explorer\iexplore.exe
-
デバッグ]タブで
コマンドライン引数
から
http://msdn.microsoft.com/en-us/library/ms976373.aspx#bho_getintouch
-
ビルドイベント]タブで ビルド後のイベントのコマンドライン にします。
C:♪Program Files (x86)♪Microsoft SDK ♪Windows v7.0A ♪Bin ♪NETFX 4.0 Tools x64 "C:\WindowsMicrosoft.NETFrameworkv4.0.30319RegAsm.exe"/unregister "$(TargetDir)$(TargetFileName)"./unregister "$(TargetFileName)$(TargetFileName)" "C:\WindowsMicrosoft.NET Framework vo4.0.30319RegAsm.exe" "$(TargetDir)$(TargetFileName)"
注意 私のコンピュータはx64なので、私のマシンではgacutilの実行ファイルのパスの中に特定のx64がありますが、あなたのマシンでは違うかもしれません。
64ビットIE 64bitコンパイル、64bit登録されたBHOが必要です。64bitのRegAsm.exe(通常はC:³³³³³に格納されています)を使用します。
このアドオンの仕組み
DOMツリーをすべてトラバースし、ボタンで設定したテキストを黄色い背景に置き換えます。黄色くなったテキストをクリックすると、ページ上に動的に挿入されたjavascriptの関数が呼び出されます。デフォルトの単語は'browser'で、たくさんの単語にマッチします。 EDIT ハイライトする文字列を変更した後、URLボックスをクリックし、Enterキーを押す必要があります... F5が効かないのは、F5が「ナビゲーション」とみなされ、navigateイベントをリッスンする必要があるからだと思います(たぶん)。後で修正しようと思います。
さて、そろそろ時間です。とても疲れました。 旅行に行っているので答えられないかもしれませんが、その間にここに来るようにします。
関連
-
[解決済み] [Solved] 不正な文字列値: '\xEFxBFxBD' for column
-
[解決済み】ファイルへの読み書きの際に共有違反のIOExceptionが発生する C#
-
[解決済み] C#で文字列のエンコーディングを手動で指定せずに、一貫性のあるバイト表現を得るには?
-
[解決済み] foreachループの現在の反復処理のインデックスを取得するにはどうすればよいですか?
-
[解決済み] .NETコンソールアプリケーションでアプリケーションのパスを取得するにはどうすればよいですか?
-
[解決済み] Internet ExplorerのIFRAMEでCookieがブロックされる/保存されない
-
[解決済み] Internet Explorerで'console'が未定義のエラーになる。
-
[解決済み] Internet Explorer 6、Internet Explorer 7、Internet Explorer 8を同一マシンで動作させる場合
-
[解決済み】Internet Explorerのブラウザで、JavaScriptのArray indexOf()を修正する方法
-
[解決済み】Internet ExplorerでjQueryのAjaxリクエストがキャッシュされないようにするには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] エンティティタイプ ApplicationUser は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み] [Entity Framework 4.1でエンティティに関連オブジェクトを追加する際に、エンティティオブジェクトをIEntityChangeTracker.の複数のインスタンスから参照できない。
-
[解決済み】統合マネージドパイプラインモードで適用されないASP.NETの設定が検出された
-
[解決済み】SmtpException: トランスポート接続からデータを読み取れません:net_io_connectionclosed
-
[解決済み】「namespace x already contains a definition for x」エラーの修正方法は?VS2010にコンバートした後に発生しました。
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み】Visual Studio: 操作を完了できませんでした。パラメータが正しくありません
-
[解決済み】5.7.57 SMTP - MAIL FROMエラー時に匿名メールを送信するためにクライアントが認証されない
-
[解決済み】ランダムなブーリアンを生成する最速の方法
-
[解決済み】データが存在しないのに読み込もうとする試みが無効である