5年前に小さなトピックを申請しました-TerraExplorerに基づいたルーティング結果の3次元表示、それは本当に遅れることはありません。この2日間でテクニカルルートを確認します。
1.インストールと構成
前回の記事の紹介によると、TerraExplorer5.1.3とTerraBuilder1.7.6はコンピューターの時間を変更する必要がなく、使用に問題はありませんが、開発することはできません。VB、VC、VC #ArcGIS VBAを含め、機能しません。多くの方法を試しても機能しません。後で、TerraExplorer6.5およびTerraBuilder6.5をインストールした後、ライセンスファイルの有効期限が切れていても、変更後に使用できます。心配しないで、正直に時間を変更してTE / TBを使いましょう。
ArcGIS 10.2SDKはVS2013にインストールできますが、それでもアドインを開発することはできません。Webマスターの経験は次のとおりです。
まず、このような問題が発生しました。ValidateAddInXMLTask
エラー2「ValidateAddInXMLTask」タスクが予期せず失敗しました。
System.IO.FileNotFoundException:ファイルまたはアセンブリ "Microsoft.VisualStudio.Shell.11.0、Version = 11.0.0.0、Culture = neutral、PublicKeyToken = b03f5f7f11d50a3a"またはその依存関係の1つを読み込めませんでした。システムは、指定されたファイルを見つけることができません。
警告:アセンブリバインディングログはオフになっています。
アセンブリバインディングの失敗ログを有効にするには、レジストリ値[HKLM \ Software \ Microsoft \ Fusion!EnableLog](DWORD)を1に設定します。
注:アセンブリバインディングの失敗ログに関連して、パフォーマンスが低下します。
この機能をオフにするには、レジストリ値[HKLM \ Software \ Microsoft \ Fusion!EnableLog]を削除してください。GuanluanView
はMicrosoft.VisualStudio.Shell.11.0インストールパッケージをダウンロードしましたが、これは約227MB解決されました。
その後、別の問題が発生しました。つまり、このアドインにGUIコンポーネントが見つかりません。多くの方法を試した後、ArcGISの可能性があります。 10.2はアドインを登録できません。対応するdllが発生しましたが、これはトリックではありません。
最初からスクラッチしてみたところ、このアドイン方式にも問題があり、ArcGISとの結合が高すぎて適切ではないことがわかりました。この方法は、VBAを使用する場合ほど良くありません。VBAの主な問題は、開発能力が弱いことですが、以下に示すように、ArcMapとの相互作用が向上します。
2. VBAはプロセスメッセージをVC#に送信します
「プログラミングが大好きです」というメッセージを送信するためのVBAコード:
オプション明示
プライベートタイプCOPYDATASTRUCT
dwData As Long
cbData As Long
lpData As Long
エンドタイプ
プライベート定数WM_COPYDATA =&H4A
プライベート宣言関数FindWindowLib "user32"エイリアス_
"FindWindowA"(ByVal lpClassName As String、ByVal lpWindowName _
文字列として)長さ
プライベート宣言関数SendMessageLib "user32"エイリアス_
"SendMessageA"(ByVal hwnd As Long、ByVal wMsg As Long、ByVal _
wParam As Long、lParam As Any)As Long
'メモリのブロックをある場所から別の場所にコピーします。
プライベート宣言サブCopyMemoryLib "kernel32"エイリアス "RtlMoveMemory" _
(hpvDest As Any、hpvSource As Any、ByVal cbCopy As Long)
プライベートサブCommandButton1_Click()
COPYDATASTRUCTとしての薄暗いCD
薄暗いThWnd
Dim buf(1〜1024)As Byte
文字列を暗くする、i As Long、lLen As Long
'ターゲットアプリケーションのハードウェアを取得します
ThWnd = FindWindow(vbNullString、 "Target")
a $ = "我爱编程"&Format(Now、 "yyyy-MM-dd HH:mm:ss")& "!"
'文字列をバイト配列にコピーし、ASCIIに変換します
lLen = LenB(StrConv(a、vbFromUnicode))
CopyMemoryを呼び出す(buf(1)、ByVal a、lLen)
cds.dwData = 3
cds.cbData = lLen + 1
cds.lpData = VarPtr(buf(1))
i = SendMessage(ThWnd、WM_COPYDATA、ThisDocument.Parent.hwnd、cds)
エンドサブ
プライベートサブUserForm_Initialize()
'これにより、ターゲットアプリが実行されていることがわかります
'そしてあなたは正しいhWndを指しています
Me.Caption = Hex $(FindWindow(vbNullString、 "Target"))
エンドサブ
メッセージを受信するForm1.csのVC#コード
システムを使用する;
System.Collections.Genericを使用する;
System.ComponentModelを使用します。
System.Dataを使用する;
System.Drawingを使用する;
System.Linqを使用する;
System.Textを使用します。
System.Windows.Formsを使用する;
System.Runtime.InteropServicesを使用する;
名前空間 WindowsFormsApplication1
{{
パブリック 部分 クラス Form1 : フォーム
{{
パブリック Form1()
{{
InitializeComponent();
this .Text = "Target" ;
}
保護 オーバーライド ボイド DefWndProc(REF メッセージ M)
{{
スイッチ (m.Msg)
{{
ケース WM_COPYDATA:
COPYDATASTRUCT cdata = new COPYDATASTRUCT();
タイプ mytype = cdata.GetType();
cdata =(COPYDATASTRUCT)m.GetLParam(mytype);
this .textBox1.Text = cdata.lpData;
休憩;
デフォルト:
base .DefWndProc(ref m);
休憩;
}
}
// WM_COPYDATAメッセージの主な目的は、読み取り専用データをプロセス間で受け渡せるようにすることです。
private const int WM_COPYDATA = 0x004A;
//メッセージの受け渡し中のWM_COPYDATAによるWindowsは、継承同期モードを提供しません。
//その中で、WM_COPYDATAに対応する16進数は0x004Aです
public struct COPYDATASTRUCT
{{
public int dwData;
public int cbData;
[ MarshalAs(UnmanagedType .LPStr)]
パブリック 文字列 lpData;
}
}
}
結果チャートは次のとおりです。
詳細については、xiaok海洋測量およびマッピングネットワークと同名の公開アカウントを参照してください。