『パブリックオブジェクトモジュールで定義されたユーザー定義型に限り、変数に割り当てることができ、実行時バインディングの関数を渡すことができます』が解決出来ない
----------
標準モジュール
Public Type pMode
nSize As Integer
nOption As Integer
End Type
Public OPEN_MODE As pMode
'ハンドル取得
Public Declare Function XDW_OpenDocumentHandle Lib "XDWAPI.DLL" (ByVal FPath, ByVal pHandle, ByVal sMODE As pMode) As Long
----------------
フォームモジュール
Private Sub AddAnnotationTest_Click()
'ハンドル取得
Dim OpenHandle As Long
Dim Handle As Long
Dim xom As pMode
xom.nOption = XDW_OPEN_UPDATE
OpenHandle = XDW_OpenDocumentHandle(FilePath.Text, Handle, CVar(xom))
---------
CVar(xom)がマークされコンパイルが出来ない
宣言は間違っていないと思っているのですが?
なにが悪いのかがわからない
どなたか教えて下さい
CVarを使わずに指定してみては如何ですか?
OLE系のAPIでも無ければ、CVarを使う必要は殆ど無いかと。
> CVar(xom)がマークされコンパイルが出来ない
CVar関数は、Variant型に変換するための関数ですよね。
ユーザー定義型をVariant型に変換するためには、
パブリックオブジェクトモジュールで定義されている必要があります。
つまり、標準モジュールではなく、ActiveXプロジェクトを作成して、
InstancingプロパティをPrivate以外に設定したクラス内でユーザー定義型を
宣言するか、もしくは、タイプライブラリで構造体を定義しない限り、
Variant型には変換できない、ということかと。
魔界の仮面弁士さん 返事ありがとうございます
まず、CVarを使わずにすると、コンパイルはOKでしたが
『DLLが正しく呼び出せません』となり、実行時エラーが発生
次に、ActiveXプロジェクトを作成して、と思ったのですが
(たぶんDLLを作成すればよいのかな?)
前記のソースコードを置き換えるだけなのでしょうが、
知識・経験不足ゆえにどうすればよいのか、見当が付かず
迷子状態に至っています
> まず、CVarを使わずにすると、コンパイルはOKでしたが
> 『DLLが正しく呼び出せません』となり、実行時エラーが発生
XDWAPI.DLL という物は知らないのですが(DocuWorks API、という物ですか?)、
そのエラーが出る原因としては、
(1) DLL側が、VBから呼び出せるように設計されていない。
(2) Declare宣言が間違っている。
のいずれかだと思われます。
(1)については、「stdcall 呼び出し規則に従っているDLL」以外は
利用できません。それ以外のDLLだと、(開発環境からの呼び出し時に)
「DLLが正しく呼び出せません」というエラーになります。
(2)については、引数の数・引数のデータ型・戻り値の方・ByVal/ByRefなどが
間違っていた場合に発生します。
> 次に、ActiveXプロジェクトを作成して、と思ったのですが
引数が「Variant」で受けるようになっているならまだしも、
構造体として受け取る仕様であるなら、ActiveX化する必要は
おそらく無いかと思われます。
魔界の仮面弁士さん 返事 本当にありがとうございます
>XDWAPI.DLL という物は知らないのですが(DocuWorks API、という物ですか?)
鋭い!まさにその通りです。
原因は多分(2)のように思われます
[解決]ではないのですが、
Cで考えて見ます
とりあえず、クローズします
魔界の仮面弁士さん 改めて御礼申し上げます。
とりあえず、開発キットという物をダウンロードしてみたところ…
typedef struct tag_XDW_OPEN_MODE {
int nSize;
int nOption;
} XDW_OPEN_MODE;
int XDWAPI XDW_OpenDocumentHandle(
const char* lpszFilePath,
XDW_DOCUMENT_HANDLE* pHandle,
XDW_OPEN_MODE* pOpenMode);
のような仕様になっているようですね。
という事は、
Public Type XDW_OPEN_MODE
nSize As Long
nOption As Long
End Type
Public Declare Function XDW_OpenDocumentHandle Lib "XDWAPI.DLL" _
(ByVal FPath As String, _
ByVal pHandle As OLE_HANDLE, _
ByVal sMODE As XDW_OPEN_MODE) As Long
で如何でしょう。環境が無いので、こちらでは確認できませんけど。
# 元質問の宣言では、第1/第2引数が規定の型(通常はVariant)に
# なっていたので、少し置き変えてみました。
魔界の仮面弁士さん
開発キットまでDLして検証していただきまして
本当にありがとうございます。
参考にしてみます
すみません、訂正です。第2引数の宣言は、
『XDW_DOCUMENT_HANDLE pHandle』ではなく、
『XDW_DOCUMENT_HANDLE* pHandle』でしたので、
ByRefにする必要があると思います。
Public Declare Function XDW_OpenDocumentHandle Lib "XDWAPI.DLL" _
(ByVal FPath As String, _
ByRef pHandle As Long, _
ByVal sMODE As XDW_OPEN_MODE) As Long
ツイート | ![]() |