- 追加された行はこの色です。
- 削除された行はこの色です。
*Visual Basic [#uaa6ccd6]
&color(White,#5F2F2F){ ''◆目次◆'' };&br;
#contents
*VB [#oa25d360]
-http://msdn.microsoft.com/ja-jp/library/2x7h1hfk.aspx
-http://msdn.microsoft.com/ja-jp/library/vstudio/2x7h1hfk.aspx
*VB コンパイラ [#gfc5181e]
**vbc [#b8a94c02]
-[[Microsoft® Build Tools 2013 Preview:http://www.microsoft.com/ja-jp/download/details.aspx?id=39318]] MSBuild, C# コンパイラ, VB コンパイラ
-[[MSBuild is now part of Visual Studio!:http://blogs.msdn.com/b/visualstudio/archive/2013/07/24/msbuild-is-now-part-of-visual-studio.aspx]]
-[[MicrosoftのC#とVBコンパイラが無償提供へ:http://www.infoq.com/jp/news/2013/08/msbuildtools]]
*[[fwdsumatrapdf>SumatraPDF/fwdsumatrapdf]] &aname(fwdsumatrapdf); [#cd033ba4]
**VB 版 [#ke8d064a]
コマンドラインからビルドする場合は以下のようにしてビルドします.~
>C:
>cd C:\w32tex\bin
C:\w32tex\bin>vbc fwdsumatrapdf.vb
----
-C:\w32tex\bin\fwdsumatrapdf.vb
----
' vim: ts=4 sw=4 expandtab:
' >vbc fwdsumatrapdf.vb
Option Compare Binary
Option Explicit On
Option Infer On
Option Strict On
Imports System
Imports System.IO
Imports System.Diagnostics
Imports System.ComponentModel
Imports System.Runtime.InteropServices
Imports Microsoft.Win32
Imports Microsoft.VisualBasic
Namespace Ddeml
Public Class Ddeml
Public Class DdemlError
Inherits Exception
Public Sub New(e As String)
MyBase.New(e)
End Sub
End Class
Public Delegate Function DdeCallback(uType As UInteger, uFmt As UInteger, hconv As IntPtr, hsz1 As IntPtr, hsz2 As IntPtr, hdata As IntPtr, dwData1 As UInteger, dwData2 As UInteger) As IntPtr
Public Const APPCMD_CLIENTONLY As UInteger = &H10UI
Public Const CP_WINUNICODE As Integer = 1200I
Public Const CF_UNICODETEXT As UInteger = 13UI
Public Const XCLASS_FLAGS As UInteger = &H4000UI
Public Const XTYP_EXECUTE As UInteger = (&H0050UI Or XCLASS_FLAGS)
<DllImport("user32.dll", EntryPoint:="DdeInitializeW", CharSet:=CharSet.Unicode)> _
Public Shared Function DdeInitializeW(ByRef pidInst As UInteger, pfnCallback As DdeCallback, afCmd As UInteger, ulRes As UInteger) As UInteger
End Function
<DllImport("user32.dll", EntryPoint:="DdeUninitialize", CharSet:=CharSet.Unicode)> _
Public Shared Function DdeUninitialize(idInst As UInteger) As Boolean
End Function
<DllImport("user32.dll", EntryPoint:="DdeCreateStringHandleW", CharSet:=CharSet.Unicode)> _
Public Shared Function DdeCreateStringHandleW(idInst As UInteger, psz As String, iCodePage As Integer) As IntPtr
End Function
<DllImport("user32.dll", EntryPoint:="DdeFreeStringHandle", CharSet:=CharSet.Unicode)> _
Public Shared Function DdeFreeStringHandle(idInst As UInteger, hsz As IntPtr) As Boolean
End Function
<DllImport("user32.dll", EntryPoint:="DdeCreateDataHandle", CharSet:=CharSet.Unicode)> _
Public Shared Function DdeCreateDataHandle(idInst As UInteger, pSrc As String, cb As UInteger, cbOff As UInteger, hszItem As IntPtr, wFmt As UInteger, afCmd As UInteger) As IntPtr
End Function
<DllImport("user32.dll", EntryPoint:="DdeFreeDataHandle", CharSet:=CharSet.Unicode)> _
Public Shared Function DdeFreeDataHandle(hData As IntPtr) As Boolean
End Function
<DllImport("user32.dll", EntryPoint:="DdeConnect", CharSet:=CharSet.Unicode)> _
Public Shared Function DdeConnect(idInst As UInteger , hszServer As IntPtr, hszTopic As IntPtr, pCC As IntPtr) As IntPtr
End Function
<DllImport("user32.dll", EntryPoint:="DdeDisconnect", CharSet:=CharSet.Unicode)> _
Public Shared Function DdeDisconnect(hConvList As IntPtr) As Boolean
End Function
<DllImport("user32.dll", EntryPoint:="DdeClientTransaction", CharSet:=CharSet.Unicode)> _
Public Shared Function DdeClientTransaction(pData As IntPtr, cbData As UInteger, hConv As IntPtr, hszItem As IntPtr, wFmt As UInteger, wType As UInteger, dwTimeout As UInteger, pdwResult As IntPtr) As IntPtr
End Function
End Class
End Namespace
Namespace SumatraPDFClient
Public Class ForwardSearch
Private Const timeout As Integer = 10000I
Private Shared Sub Usage(args As String())
Dim s = "usage: " & Environment.GetCommandLineArgs()(0) & " pdffile texfile line"
If args.Length = 3 Then
Return
Else
Console.Error.WriteLine(s)
Environment.Exit(2)
End If
End Sub
Private Shared Sub RunSumatraPDF(pdf As String)
If Process.GetProcessesByName("SumatraPDF").Length <> 0 Then
Return
Else
Dim ps = New Process()
Try
Dim sumatrapdfRegistry = "SumatraPDF.exe"
Dim keyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\SumatraPDF.exe"
Using rKey = Registry.LocalMachine.OpenSubKey(keyPath)
sumatrapdfRegistry = rKey.GetValue(String.Empty).ToString()
End Using
If File.Exists(sumatrapdfRegistry) Then
ps.StartInfo.FileName = sumatrapdfRegistry
Else
Throw New FileNotFoundException()
End If
Catch e As Exception
Dim sumatrapdfWin32Default = "C:\Program Files\SumatraPDF\SumatraPDF.exe"
Dim sumatrapdfWin64Default = "C:\Program Files (x86)\SumatraPDF\SumatraPDF.exe"
if File.Exists(sumatrapdfWin32Default) Then
ps.StartInfo.FileName = sumatrapdfWin32Default
Else If File.Exists(sumatrapdfWin64Default) Then
ps.StartInfo.FileName = sumatrapdfWin64Default
Else
ps.StartInfo.FileName = Interaction.InputBox("Input the path to SumatraPDF.exe.", "fwdsumatrapdf", "SumatraPDF.exe")
End If
End Try
ps.StartInfo.Arguments = "-reuse-instance " & """" & pdf & """"
ps.Start()
ps.WaitForInputIdle(timeout)
End If
End Sub
Private Shared Sub DdeExecute(server As String, topic As String, executeCommand As String)
Dim idInstance = 0UI
Dim hszServer = IntPtr.Zero
Dim hszTopic = IntPtr.Zero
Dim hConvClient = IntPtr.Zero
Dim hDdeData = IntPtr.Zero
Dim hDdeTransactionData = IntPtr.Zero
Try
Ddeml.Ddeml.DdeInitializeW(idInstance, Function(uType, uFmt, hconv, hsz1, hsz2, hdata, dwData1, dwData2) IntPtr.Zero, Ddeml.Ddeml.APPCMD_CLIENTONLY, 0UI)
If idInstance = 0UI Then Throw New Ddeml.Ddeml.DdemlError("DdeInitializeW error")
hszServer = Ddeml.Ddeml.DdeCreateStringHandleW(idInstance, server, Ddeml.Ddeml.CP_WINUNICODE)
If hszServer = IntPtr.Zero Then Throw New Ddeml.Ddeml.DdemlError("DdeCreateStringHandleW error")
hszTopic = Ddeml.Ddeml.DdeCreateStringHandleW(idInstance, topic, Ddeml.Ddeml.CP_WINUNICODE)
If hszTopic = IntPtr.Zero Then Throw New Ddeml.Ddeml.DdemlError("DdeCreateStringHandleW error")
hConvClient = Ddeml.Ddeml.DdeConnect(idInstance, hszServer, hszTopic, IntPtr.Zero)
If hConvClient = IntPtr.Zero Then Throw New Ddeml.Ddeml.DdemlError("DdeConnect error")
hDdeData = Ddeml.Ddeml.DdeCreateDataHandle(idInstance, executeCommand, CType((executeCommand.Length + 1)*Len(Char.MinValue), UInteger), 0UI, IntPtr.Zero, Ddeml.Ddeml.CF_UNICODETEXT, 0UI)
If hDdeData = IntPtr.Zero Then Throw New Ddeml.Ddeml.DdemlError("DdeCreateDataHandle error")
hDdeTransactionData = Ddeml.Ddeml.DdeClientTransaction(hDdeData, UInteger.MaxValue, hConvClient, IntPtr.Zero, 0UI, Ddeml.Ddeml.XTYP_EXECUTE, CType(timeout, UInteger), IntPtr.Zero)
If hDdeTransactionData = IntPtr.Zero Then Throw New Ddeml.Ddeml.DdemlError("DdeClientTransaction error")
Finally
If hDdeTransactionData <> IntPtr.Zero Then Ddeml.Ddeml.DdeFreeDataHandle(hDdeTransactionData)
If hDdeData <> IntPtr.Zero Then Ddeml.Ddeml.DdeFreeDataHandle(hDdeData)
If hszServer <> IntPtr.Zero Then Ddeml.Ddeml.DdeFreeStringHandle(idInstance, hszServer)
If hszTopic <> IntPtr.Zero Then Ddeml.Ddeml.DdeFreeStringHandle(idInstance, hszTopic)
If hConvClient <> IntPtr.Zero Then Ddeml.Ddeml.DdeDisconnect(hConvClient)
If idInstance <> 0UI Then Ddeml.Ddeml.DdeUninitialize(idInstance)
End Try
End Sub
<STAThread> _
Public Shared Sub Main(args As String())
Usage(args)
Dim pdf = args(0)
Dim tex = args(1)
Dim texLine = args(2)
Try
Integer.Parse(texLine)
RunSumatraPDF(pdf)
Dim active = 0I
Dim forwardSearch = "[ForwardSearch(""" & pdf & """,""" & tex & """," & texLine & ",0,0," & active.ToString() & ")]"
DdeExecute("SUMATRA", "control", forwardSearch)
Catch e As Win32Exception
Console.Error.WriteLine(e.Message)
Environment.Exit(-3)
Catch e As InvalidOperationException
Console.Error.WriteLine(e.Message)
Environment.Exit(-2)
Catch e As Exception
Console.Error.WriteLine(e.Message)
Environment.Exit(-1)
End Try
End Sub
End Class
End Namespace
----