1

Access 2010のVBAコードに問題があります。型を宣言しましたが、この型の変数のポインターを(関数VarPtrを使用して)取得しようとすると、が取得されますcompilation error: incompatible type

Dim dm As DEVMODE
Dim pd As PRINTER_DEFAULTS

pd.pDevMode = VarPtr(dm) ' the line that throws the error

' pDevMOde is a Long that is supose to contain the adress of the dm variable

Private Type DEVMODE
  dmDeviceName As String * CCHDEVICENAME ' (1 To CCHDEVICENAME) As Byte
  dmSpecVersion As Integer
  dmDriverVersion As Integer
  dmSize As Integer
  dmDriverExtra As Integer
  dmFields As Long
  dmOrientation As Integer
  dmPaperSize As Integer
  dmPaperLength As Integer
  dmPaperWidth As Integer
  dmScale As Integer
  dmCopies As Integer
  dmDefaultSource As Integer
  dmPrintQuality As Integer
  dmColor As Integer
  dmDuplex As Integer
  dmYResolution As Integer
  dmTTOption As Integer
  dmCollate As Integer
  dmFormName As String * CCHFORMNAME '(1 To CCHFORMNAME) As Byte
  dmUnusedPadding As Integer
  dmBitsPerPel As Integer
  dmPelsWidth As Long
  dmPelsHeight As Long
  dmDisplayFlags As Long
  dmDisplayFrequency As Long
End Type

問題は、このコードが以前のバージョンのAccessで作成され、バージョン2003以下で完全に機能することです。Access 2010で機能しない理由はわかりません。2010バージョンと2003バージョンの違いを調べましたが、これに関連するものは見つかりませんでした。

誰か手がかりがありますか?

ありがとう!

4

1 に答える 1

3

私はついに問題を見つけました。実際には64ビットバージョンには違いがあります。VarPtrはLong型を返さなくなり、LongPtr型変数を返し、私のコードはLongPtrをLongに入れることができませんでした

ここを参照してください:http://msdn.microsoft.com/en-us/library/ee691831.aspx

VarPtr | バリアントコンバータ。| 64ビットバージョンではLongPtrを返し、32ビットバージョン(4バイト)ではLongを返します。

それが他の誰かに役立つことを願っています!

于 2012-12-28T15:02:14.440 に答える