- 締切済み
Access2003からC言語、DLLへのバイナリコード引渡しについて
お世話になります。 Access2003VBAからCで作成したDLLを呼び出す際に引数として文字列(バイナリコード)を引き渡したいのですが、うまくいきません。 見た目にはうまく渡されているのですが、バイナリコードを16進数で表示すると引渡し前データと引渡し後データで所々、2byte単位で違う箇所がありました。(1箇所だけ2byte単位でない例外もありました) これはVBAで扱っているユニコード値からCで扱っているアスキーコード値へ変換する際に起こってしまう不具合なのでしょうか? 対応策などございましたらご教授頂けないでしょうか? 宜しくお願い致します。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- redfox63
- ベストアンサー率71% (1325/1856)
Byte型配列で渡すなら DLL側 __declspec( __dllexport ) void Sample01( LPSAFEARRAY* pbuf ) { int cdims, lBound, uBound, n; char val; // 配列の次元数を取得 cDims = SafeArrayGetDims( *pbuf ); // 並列の添え字の下限・上限を取得 SafeArrayGetLBound( *pbuf, cDims, & lBund ); SafeArrayGetUBound( *pbuf, cDims, & uBund ); for( n=lBound; n < uBound+1; n++ ) { // 配列の要素を取得 SafeArrayGetElement( *pbuf, &n, &val ); // 加工 val = (char)n; // 配列要素を更新 SefeArrayPutElement( *pbuf, &n, &val ); } } VBA側 delcalre Sub Sample01 lib "DLL名" ( ByRef ar() as Byte ) Sub Macro1 Dim ar(255) as Byte Sample01 ar End Sub といった具合です
- redfox63
- ベストアンサー率71% (1325/1856)
バイナリデータを文字列で渡すためでしょうね Declareで宣言された関数へはVB側で自動的に Unicode->ANSI戻ってくる際に ANSI->UNICODEの変換が行われます タイプライブラリの場合… 参照設定を使う場合は自動変換はしません やり取りの際には C側はBSTR型で受け答えしたほうが良いでしょう また文字列を新規に作って返すような場合や長さを変更する場合は 新規なら SysAllocStringByteLen 変更なら SysReAllocString などを使います 試しに当方でも 256文字分のスペースを設定した文字列を渡して 先頭から末尾へ 0から255の数値を設定して返すような関数を定義した際 戻ってきた文字の長さが 225文字になってしまいました 逆をやろうとしても Byte配列に0から255まで設定し String型の変数に代入する時点でやはり 225文字になってしまいます バイナリデータを送るならInteger型またはByte型の配列で渡したほうが良いかもしれません この場合 SafeArrayを使うことになります VC6.0のMSDNで … 2001年10月版の目次ですから無いかもしれませんが 技術文書 ビジュアルツール VisualBasic Microsoft Visual Basic Version 5.0 で使用する DLL の開発に関する注意 などを参照してみてください
- Hayashi_Trek
- ベストアンサー率44% (366/818)
そのDLLは、UNICODEの文字列を扱えるのでしょうか? もし、JISコード文字列が前提になっているなら VBA側で、文字列を strAnsi = StrConv(strUnicode, vbFromUnicode) として、JISコード文字列に変換したものを DLLに渡します。